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)

関連記事