Pythonでリストをコピーする

=は参照渡しになるため、別々のリストとして変更したいときにうまくいかない。

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]]

参考