up:: Python
source:: Pythonのcopyとdeepcopyについて - Qiita
変数にはミュータブルとイミュータブルがある。
ミュータブルは再代入可能。ほとんどがこっち。
イミュータブルは再代入不可。文字列、数字、タプルなど。
ミュータブルは新たな値を追加や連結したりしても、指すIDが変わらない。
イミュータブルは変わる。
で、配列はミュータブルなので、二次元配列に配列変数を代入し、配列変数を変更すると二次元配列側も書き換わってしまう。
それを防ぐのがcopy。
# ソースコード
import copy
a = [1, 2]
b = copy.copy(a)
a.append(3)
print ("a = %s" % a)
print ("b = %s" % b)
print ("id(a) = %i" % id(a))
print ("id(b) = %i" % id(b))
# 実行結果
a = [1, 2, 3]
b = [1, 2]
id(a) = 140092728379976
id(b) = 140092728395208
このようにIDを書き換えることが出来るので、二次元配列もcopyした変数配列を入れてやれば無用な編集は生まれない。
なお配列の場合はスライスを使って配列[:]
で事足りる模様。
ちなみに、二次元配列をcopyするならdeepcopy()
を使わないと下まで完全コピーできない。