Pythonでは、変数間でデータをやり取りする際に「参照渡し」と「値渡し」の2つの方法があります。これらの違いを理解することは、プログラムの挙動を正確に予測するために重要です。
参照渡しとは
参照渡しは、変数がオブジェクトのメモリ上の場所を指し示す値を持つため、変数同士で値を代入すると、同じオブジェクトを参照するようになります。
a = [1,2]
b = a
b[0] = 100
print(a) # [100, 2]
この例では、b
を書き換えるとa
も書き換わります。これは、a
とb
が同じオブジェクトを参照しているためです。
値渡しとは
値渡しは、新たなオブジェクトを作成し、そのオブジェクトに元のオブジェクトの値をコピーします。Pythonでは、copy
メソッドを使用して値渡しを行います。
a = [1,2]
b = a.copy()
b[0] = 100
print(a) # [1, 2]
この例では、b
を書き換えてもa
は変わりません。これは、b
がa
のコピーであり、a
とは別の新しいオブジェクトを参照しているからです。
深いコピーとは
しかし、値渡し(浅いコピー)は、オブジェクトの中にさらにオブジェクトが含まれる場合(例えば、リストの中にリストがある場合)には、内部のオブジェクトまではコピーしません。そのような場合には、copy
ライブラリのdeepcopy
メソッドを使用します。
import copy
a = [[1,2], [3,4]]
b = copy.deepcopy(a)
b[0][0] = 100
print(a) # [[1, 2], [3, 4]]
この例では、b
を書き換えてもa
は変わりません。これは、deepcopy
メソッドがa
の全ての要素(内部のリストも含む)をコピーした新しいオブジェクトを作成するためです。
以上がPythonのcopy
メソッドと参照についての基本的な説明です。これらの概念を理解することで、Pythonのデータ操作がより明確になり、意図しないデータの変更を避けることができます。