Pythonでリスト(List型)を使っていると、「元のリストと同じ内容のコピーを作りたい」と思うことがよくあります。
この記事では、そんなときに使える copy()
メソッドについて、初心者向けにわかりやすく解説します。
Pythonにおけるリストのコピーとは?
Pythonのリストは参照型のオブジェクトです。つまり、別の変数に代入しても、「同じデータを指している」だけであり、コピーではないという点に注意が必要です。
単純な代入ではコピーにならない
a = [1, 2, 3]
b = a
b[0] = 100
print(a) # → [100, 2, 3]
解説:b = a
は「aをbにコピーした」のではなく、「aをbに参照させた」だけなので、b
を変更するとa
も変わってしまいます。
copy()メソッドの使い方
Pythonでは、リストの内容を複製するには、copy()
メソッドを使います。
構文(基本型)
新しい変数 = 元のリスト.copy()
実際のコード例で確認してみよう
test = [55, 70, 90, 90, 80, 45]
print("元のリスト:", test)
test2 = test.copy()
print("コピーしたリスト:", test2)
実行結果:
元のリスト: [55, 70, 90, 90, 80, 45]
コピーしたリスト: [55, 70, 90, 90, 80, 45]
結果からわかるように、test.copy()
によって 元のリストと同じ内容の新しいリストが作成されています。
このコピーは独立しており、test2
を変更してもtest
には影響しません。
copy()でコピーしたリストは独立しているのか?
独立している(シャローコピー)
test2[0] = 999
print("元のリスト:", test)
print("変更後のコピー:", test2)
元のリスト: [55, 70, 90, 90, 80, 45]
変更後のコピー: [999, 70, 90, 90, 80, 45]
→ コピー元 test
は変更されていません!これは「シャローコピー(浅いコピー)」と呼ばれるものです。
注意!copy()では深いコピーにはならない
リストの中にさらにリスト(多次元リスト)がある場合、copy()
メソッドは内部のリストまではコピーしません。内部リストは参照されたままになります。
例:シャローコピーの落とし穴
a = [[1, 2], [3, 4]]
b = a.copy()
b[0][0] = 999
print(a) # → [[999, 2], [3, 4]]
解説:外側のリストはコピーされても、内側のリスト([1, 2]など)は参照のままです。
完全に独立したコピーが欲しいときは?
deepcopy(ディープコピー)を使いましょう。これはcopy
モジュールに含まれています。
import copy
a = [[1, 2], [3, 4]]
b = copy.deepcopy(a)
b[0][0] = 999
print(a) # → [[1, 2], [3, 4]]
print(b) # → [[999, 2], [3, 4]]
deepcopy()
はすべての階層のオブジェクトを完全にコピーするので、多次元リストを使う場合はこちらがおすすめです。
関連記事(内部リンク)
まとめ
操作方法 | 説明 |
---|---|
b = a | 参照をコピー。変更すると両方影響する |
b = a.copy() | シャローコピー。浅いレベルで独立 |
b = copy.deepcopy(a) | ディープコピー。完全に独立(多次元に有効) |
おわりに
Pythonでリストを扱う場面はとても多いです。
正しくコピーを使い分けることで、予期せぬバグやデータ破壊を防ぐことができます。
特に多次元リストや辞書を含むリストなどを操作する場合は、コピーの挙動を意識することが大切です。