Pythonでリストを扱う際、「元のリストを残してコピーしたい」「変更が元に影響しないようにしたい」といった場面がよくあります。
そんなときに使えるのが、list.copy()メソッドです。
この記事では、copy()の基本的な使い方から、コピーの注意点、他のコピー方法との違いまでを初心者にもわかりやすく説明します。
list.copy()の基本的な使い方
書き方
新しいリスト = 元のリスト.copy()
使用例:リストをそのままコピー
# フルーツのリストを作成
fruits = ["りんご", "バナナ", "みかん"]
# リストをコピー
new_fruits = fruits.copy()
# 結果を確認
print(new_fruits) # ['りんご', 'バナナ', 'みかん']
コピーしたリストは独立している
元のリストに影響しない例
# 数字のリストを作成
a = [1, 2, 3]
# リストをコピー
b = a.copy()
# コピーしたリストを変更
b[0] = 99
# 結果を確認
print(f"元のリスト:{a}") # [1, 2, 3](変更なし)
print(f"コピーしたリスト:{b}") # [99, 2, 3]
リストの中にリストがあるときの注意点
問題が起きる例
# リストの中にリストがある場合
a = [[1, 2], [3, 4]]
b = a.copy()
# 内側のリストを変更
b[0][0] = 999
# 結果を確認
print(f"元のリスト:{a}") # [[999, 2], [3, 4]](影響を受けた!)
print(f"コピーしたリスト:{b}") # [[999, 2], [3, 4]]
解決方法:copy.deepcopy()を使う
import copy
# リストの中にリストがある場合
a = [[1, 2], [3, 4]]
b = copy.deepcopy(a) # 深いコピー
# 内側のリストを変更
b[0][0] = 999
# 結果を確認
print(f"元のリスト:{a}") # [[1, 2], [3, 4]](安全)
print(f"コピーしたリスト:{b}") # [[999, 2], [3, 4]]
4. いろいろなコピー方法の比較
4つのコピー方法
| 方法 | 特徴 | 書き方 | 安全度 |
|---|---|---|---|
copy() | 一般的で読みやすい | a.copy() | 浅いコピー |
| スライス | 短く書ける | a[:] | 浅いコピー |
list()関数 | 他の型からも変換可能 | list(a) | 浅いコピー |
deepcopy() | 完全に独立 | copy.deepcopy(a) | 深いコピー |
比較例
# 元のリスト
original = [1, 2, 3]
# 4つの方法でコピー
copy1 = original.copy() # copy()メソッド
copy2 = original[:] # スライス
copy3 = list(original) # list()関数
copy4 = copy.deepcopy(original) # 深いコピー
# すべて同じ結果
print(copy1) # [1, 2, 3]
print(copy2) # [1, 2, 3]
print(copy3) # [1, 2, 3]
print(copy4) # [1, 2, 3]
実際に使える例
例1:元のリストを保ったまま変更
# クラスの名簿
class_list = ["田中", "佐藤", "鈴木", "高橋"]
# 出席者リストを作成(元の名簿は残す)
attendance = class_list.copy()
# 欠席者を削除
attendance.remove("高橋")
print(f"元の名簿:{class_list}") # ['田中', '佐藤', '鈴木', '高橋']
print(f"出席者リスト:{attendance}") # ['田中', '佐藤', '鈴木']
例2:複数のパターンを試す
# 基本設定
basic_settings = ["音楽ON", "効果音ON", "字幕OFF"]
# プレイヤー1の設定
player1_settings = basic_settings.copy()
player1_settings[2] = "字幕ON" # 字幕をONに変更
# プレイヤー2の設定
player2_settings = basic_settings.copy()
player2_settings[0] = "音楽OFF" # 音楽をOFFに変更
print(f"基本設定:{basic_settings}")
print(f"プレイヤー1:{player1_settings}")
print(f"プレイヤー2:{player2_settings}")
例3:テストデータの作成
# 基本のテスト問題
test_template = [
{"問題": "1+1=?", "答え": None},
{"問題": "2×3=?", "答え": None},
{"問題": "10÷2=?", "答え": None}
]
# 生徒Aのテスト
student_a_test = copy.deepcopy(test_template)
student_a_test[0]["答え"] = 2
student_a_test[1]["答え"] = 6
student_a_test[2]["答え"] = 5
# 生徒Bのテスト
student_b_test = copy.deepcopy(test_template)
student_b_test[0]["答え"] = 2
student_b_test[1]["答え"] = 6
student_b_test[2]["答え"] = 5
print("基本テンプレート:")
for item in test_template:
print(f" {item}")
print("\n生徒Aの回答:")
for item in student_a_test:
print(f" {item}")
例4:買い物リストの管理
# 基本の買い物リスト
shopping_list = ["牛乳", "パン", "たまご"]
# 今日の買い物リスト(追加あり)
today_shopping = shopping_list.copy()
today_shopping.append("りんご")
today_shopping.append("お肉")
# 明日の買い物リスト(一部変更)
tomorrow_shopping = shopping_list.copy()
tomorrow_shopping.remove("牛乳")
tomorrow_shopping.append("ヨーグルト")
print(f"基本リスト:{shopping_list}")
print(f"今日の買い物:{today_shopping}")
print(f"明日の買い物:{tomorrow_shopping}")
どのコピー方法を使うべき?
使い分けのコツ
シンプルなリスト(数字や文字だけ)
copy()、[:]、list()のどれでもOK- 読みやすさを重視するなら
copy()がおすすめ
リストの中にリストがある場合
copy.deepcopy()を使う- 完全に独立したコピーが作れる
短いコードで書きたい場合
[:]を使う- 1文字でもコードを短くしたいとき
実際の選び方例
# シンプルなリスト
numbers = [1, 2, 3, 4, 5]
copy_numbers = numbers.copy() # おすすめ
# リストの中にリストがある
matrix = [[1, 2], [3, 4], [5, 6]]
copy_matrix = copy.deepcopy(matrix) # これを使う
# 短く書きたい
data = ["a", "b", "c"]
copy_data = data[:] # 短い書き方
まとめ
Pythonのlist.copy()は、元のリストを保ったまま操作したいときに便利な方法です。
ただし、リストの中にリストがあるときは注意が必要で、そのときはcopy.deepcopy()を使いましょう。
この記事のポイント
list.copy()は元のリストを変更せずに新しいリストを作る- シンプルなリストなら安全に使える
- リストの中にリストがあるときは
copy.deepcopy()を使う [:]やlist()関数でもコピーできるが、目的に応じて使い分ける


コメント