【Python入門】list.copy()の使い方と注意点

python

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]

ポイント: copy()を使えば、元のリストを守りながら新しいリストを変更できます。


リストの中にリストがあるときの注意点

問題が起きる例

# リストの中にリストがある場合
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()関数でもコピーできるが、目的に応じて使い分ける

コメント

タイトルとURLをコピーしました