Python - リストを複製する
リストの複製: copy()
リストの複製には、参照渡し/浅いコピー (Shallow Copy) と 値渡し/深いコピー (Deep Copy) の2種類があります。以下のように単純に代入するだけでは参照渡し/浅いコピーとなります。
list1 = ['A', 'B', 'C']
list2 = list1
list2[0] = '1'
print(list1)
# ['1', 'B', 'C']
print(list2)
# ['1', 'B', 'C']
参照渡し/浅いコピー (Shallow Copy)
コピーしたリストを別々のリストとして扱うためには、copy
モジュールを利用します。copy
モジュールによってコピーされたリストは、値渡し/深いコピーとなります。
import copy
list1 = ['A', 'B', 'C']
list2 = copy.copy(list1)
list2[0] = '1'
print(list1)
# ['A', 'B', 'C']
print(list2)
# ['1', 'B', 'C']
値渡し/深いコピー (Deep Copy)
ただし多次元のリストの場合、copy
関数では期待どおりの結果を得ることはできません。
import copy
list1 = [['A', 'B', 'C'], ['D', 'E', 'F']]
list2 = copy.copy(list1)
list2[0][0] = '1'
print(list1)
# [['1', 'B', 'C'], ['D', 'E', 'F']]
print(list2)
# [['1', 'B', 'C'], ['D', 'E', 'F']]
多次元のリストにおける値渡し/深いコピー (Deep Copy)
多次元のリストの場合、deepcopy
関数を使用することで値渡し/深いコピーになります。
import copy
list1 = [['A', 'B', 'C'], ['D', 'E', 'F']]
list2 = copy.deepcopy(list1)
list2[0][0] = '1'
print(list1)
# [['A', 'B', 'C'], ['D', 'E', 'F']]
print(list2)
# [['1', 'B', 'C'], ['D', 'E', 'F']]
多次元のリストにおける値渡し/深いコピー (Deep Copy)