Pythonでは、他のプログラミング言語で見られるような値渡しや参照渡しの概念はありません。代わりに、すべてのオブジェクトは参照渡しされます。つまり、オブジェクトが関数の引数として渡されるとき、オブジェクトのコピーではなく、元のオブジェクトへの参照が渡されます。
しかし、一部のデータ型は、関数内で変更を加えても元のインスタンスは変更されず、新しいインスタンスが作成されます。これらのデータ型は不変(immutable)と呼ばれ、bool型やint型、str型、tuple型などが含まれます。
一方、リストや辞書などのデータ型は可変(mutable)で、これらのオブジェクトは関数内で変更を加えると、その変更は元のオブジェクトにも反映されます。
以下に、Pythonでbool型の変数を参照渡しする例を示します。
def change(var):
var[0] = not var[0]
def main():
bool_var = [False]
print(f'Before: {bool_var[0]}')
change(bool_var)
print(f'After: {bool_var[0]}')
if __name__ == "__main__":
main()
このコードでは、bool_varはリストとして定義され、その最初の要素がbool型の値を持っています。change関数では、引数として渡されたリストの最初の要素の値を反転させています。この結果、change関数を呼び出した後のbool_var[0]の値は、関数呼び出し前とは異なる値になります。
このように、Pythonでは参照渡しを行いたい場合、不変のデータ型を可変のデータ型(この例ではリスト)でラップすることで実現できます。