Pythonでは、オブジェクトへの参照を持つ変数があります。代入操作はオブジェクトをコピーせず、ターゲットとオブジェクトの間にバインディングを作成します。しかし、コレクションが変更可能であるか、変更可能なアイテムを含む場合、一つを変更しても他を変更しないようにコピーが必要となることがあります。
Pythonのcopy
モジュールを使用すると、浅いコピーと深いコピーを作成することができます。浅いコピーは新しい複合オブジェクトを作成し、元のオブジェクトに存在するオブジェクトへの参照を挿入します。一方、深いコピーは新しい複合オブジェクトを作成し、元のオブジェクトに存在するオブジェクトのコピーを再帰的に挿入します。
以下に、代入、浅いコピー、深いコピーの違いを示すPythonのコードを示します。
import copy
# 初期リスト
a = [1, 2, 3]
b = [4, 5, 6]
c = [a, b]
# 通常の代入でコピー
d = c
print(id(c) == id(d)) # True - dはcと同じオブジェクト
print(id(c[0]) == id(d[0])) # True - d[0]はc[0]と同じオブジェクト
# 浅いコピー
d = copy.copy(c)
print(id(c) == id(d)) # False - dは新しいオブジェクト
print(id(c[0]) == id(d[0])) # True - d[0]はc[0]と同じオブジェクト
# 深いコピー
d = copy.deepcopy(c)
print(id(c) == id(d)) # False - dは新しいオブジェクト
print(id(c[0]) == id(d[0])) # False - d[0]は新しいオブジェクト
このコードは、代入、浅いコピー、深いコピーがメモリ内のオブジェクトにどのように影響を与えるかを示しています。これらの違いを理解することは、Pythonでのプログラミングにおいて重要です。