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()を使わないと下まで完全コピーできない。