シャローコピーとディープコピー
シャローコピーはオブジェクトの参照先をコピーする。
コピー元のオブジェクトとコピー先のオブジェクトが同じアドレスの値を参照する。
そのため片方のオブジェクトの値を変更すると、もう一方のオブジェクトの値も変更される。
https://gyazo.com/76c0d3df0a688b23072cfd053aeee5b7
一方でディープコピーはオブジェクトの値をコピーする
コピー元のオブジェクトとコピー先のオブジェクトがそれぞれ別のアドレスの値を参照する。
そのため片方のオブジェクトの値を変更しても、もう一方のオブジェクトの値は変更されない。
https://gyazo.com/1b9760be4975492ad661ccdb76c5bcca
pythonではスライスでリストをコピーした場合、普通のリストだと問題が無いが、多重リストだとシャローコピーになってしまう。
pythonでシャローコピーになってしまう例(多重リストをスライスでコピー)
code:python
a = 1, 2, 3], 4, 5, 6, [7, 8, 9
b = a: # シャローコピー
b0.append(0) # b0(内部のリスト)はaと共通のものを参照している
print(a) # aにも0が追加されている
#1, 2, 3, 0], 4, 5, 6, [7, 8, 9
print(b)
#1, 2, 3, 0], 4, 5, 6, [7, 8, 9
これを解決するにはcopy.deepcopyを使いディープコピーを行うと解決する。
code:python
from copy import deepcopy
a = 1, 2, 3], 4, 5, 6, [7, 8, 9
b = deepcopy(a) # ディープコピー
b0.append(0) # b0(内部のリスト)はaとは別のオブジェクト
print(a) # aに影響はない
#1, 2, 3], 4, 5, 6, [7, 8, 9
print(b)
#1, 2, 3, 0], 4, 5, 6, [7, 8, 9
pythonのスライス操作について
参考リンク
https://itsakura.com/it-program-shallow