Pythonでリストをコピー(copy, deepcopy)
この記事では、Pythonにおけるリストのコピー方法について説明します。浅いコピー(copy)と深いコピー(deepcopy)の違い、そしてそれぞれの使用方法について具体的な例を用いて解説します。
目次
浅いコピー(copy)
Pythonでは、リストをコピーする際に`copy()`メソッドを使用します。これは、リストの要素への参照をコピーする"浅いコピー"です。元のリストと新しいリストは、同じオブジェクトへの参照を共有します。
list1 = [[1, 2], 3, 4]
list2 = list1.copy()
list2[0][0] = 100
print(list1) # 出力: [[100, 2], 3, 4]
print(list2) # 出力: [[100, 2], 3, 4]
上記のように、リストの中にリストなどの入れ子構造がある場合、内側のリストはコピーされず、参照が共有されます。そのため、内側のリストを変更すると、元のリストにも影響が及びます。
list1 = [1, 2, [3, 4]]
list2 = list1.copy()
list2[2][0] = 10
print(list1) #出力: [1, 2, [10, 4]]
print(list2) #出力: [1, 2, [10, 4]]
深いコピー(deepcopy)
リストの要素を完全に独立してコピーするには、`copy.deepcopy()`メソッドを使用します。これは、リストのすべての要素を再帰的にコピーする"深いコピー"です。元のリストと新しいリストは、完全に独立したオブジェクトになります。
import copy
list1 = [[1, 2], 3, 4]
list2 = copy.deepcopy(list1)
list2[0][0] = 100
print(list1) # 出力: [[1, 2], 3, 4]
print(list2) # 出力: [[100, 2], 3, 4]
上記のように、深いコピーでは、入れ子構造のリストも完全に独立してコピーされるため、内側のリストを変更しても元のリストには影響しません。
copyとdeepcopyの使い分け
リストをコピーする際には、コピーするリストの内容と、コピー後のリストの変更が元のリストに影響するか否かを考慮する必要があります。 単純なリストであれば`copy()`メソッドで十分ですが、入れ子構造のリストや、コピー後に元のリストに影響を与えてはいけない場合は`copy.deepcopy()`メソッドを使用する必要があります。
関連記事
- Pythonでリストをシャッフル(random.shuffle)
- Pythonでリストに要素を追加(append, extend, insert)
- Pythonでリストの要素を検索(in演算子, index, count)
- Pythonでリストをソート(sort, sorted)
- Pythonでリストを逆順にする(reverse, スライス[::-1])
- Pythonでリストの要素を抽出(スライス, リスト内包表記)
- Pythonでリストの要素数を取得(len)
- Pythonでリストの要素を合計(sum)
- Pythonでリストの最大値・最小値を取得(max, min)
- Pythonでリストの要素を結合(join)