=
は参照渡しになるため、別々のリストとして変更したいときにうまくいかない。
A = [1, 2, 3] B = A A[0] = 100 print(A, B) # [100, 2, 3] [100, 2, 3]
こういうときは浅いコピーか深いコピーを使って別のオブジェクトを作成する。
浅いコピー
1次元リストの場合はsliceを使うと短く書ける。
A = [1, 2, 3] B = A[:] A[0] = 100 print(A, B) # [100, 2, 3] [1, 2, 3]
copyも使える。
import copy A = [1, 2, 3] B = copy.copy(A) A[0] = 100 print(A, B) # [100, 2, 3] [1, 2, 3]
リスト内包表記でもOK。
A = [1, 2, 3] B = [x for x in A] A[0] = 100 print(A, B) # [100, 2, 3] [1, 2, 3]
深いコピー
2次元以上のリストの場合はdeepcopyを使う。
import copy A = [[1, 2, 3], [4, 5, 6]] B = copy.deepcopy(A) A[0][0] = 100 print(A, B) # [[100, 2, 3], [4, 5, 6]] [[1, 2, 3], [4, 5, 6]]