Pythonの引数渡しと値渡しはどう違うのか
Pythonでは、関数の引数の渡し方には値渡しと参照渡しの2種類があります。
- 値渡し(オブジェクトのコピーを渡す):不変オブジェクト(数値、文字列、タプルなど)を関数に渡した場合、オブジェクトのコピーが作成され、そのコピーが関数に渡される。関数内で引数を変更しても、もとのオブジェクトには影響しない。
サンプルコード:
def change_value(x):
x = 10
num = 5
change_value(num)
print(num) # 输出 5
上記のコードにおいて、変数numがchange_value関数に渡されます。関数内部では、引数xの値は10に変更されますが、元のオブジェクトであるnumには影響しません。
- 関数に可変なオブジェクト(list、dict、set など)を渡すと、オブジェクトの参照(ポインター)が渡されます。関数内で引数に対して変更を加えると、元のオブジェクトにも反映されます。
サンプルコード:
def change_list(lst):
lst.append(4)
my_list = [1, 2, 3]
change_list(my_list)
print(my_list) # 输出 [1, 2, 3, 4]
上記コードでは、リストmy_listをchange_list関数に渡しています。関数内部で、引数のlstが参照するリストにappendメソッドで要素4を追加しているため、元のリストも変更されてしまいます。
まとめ
- 不変オブジェクトでは、値渡しによってコピーを生成し、関数の内部での変更は元のオブジェクトに影響を与えない。
- 参照渡しでは、オブジェクトの参照が直接渡されるので、関数の内部でオブジェクトを変更すると、元のオブジェクトにも反映されます。