環境設定 数値 文字列 正規表現 リスト タプル 集合 辞書 ループ 関数 クラス データクラス 時間 パス ファイル スクレイピング その他

Python のリストをコピーするときは copy を使う:代入すると上書きされるリスクがある

最終更新日 2023.02.18

リストを別の変数に代入し、もとのリストに要素を追加したらどうなるか?

x = [1, 2, 3]
y = x

x.append(4)

print(x)  # [1, 2, 3, 4]
print(y)  # [1, 2, 3, 4]

yx と同じになっています。Python の代入はコピーでなく、参照です。

x = [1, 2, 3]
y = x

x.append(4)

print(x)  # [1, 2, 3, 4]
print(y)  # [1, 2, 3, 4]

print(id(x))  # 4377372544
print(id(y))  # 4377372544

id はオブジェクトを識別するユニークな値で、すべての異なるオブジェクトは違う id をもちます。逆にいえば、同じ id をもつオブジェクトは同じです。

違うオブジェクトをつくるときは代入でなく copy する

import copy

x = [1, 2, 3]
y = copy.copy(x)

x.append(4)

print(x)  # [1, 2, 3, 4]
print(y)  # [1, 2, 3]

print(id(x))  # 4377372544
print(id(y))  # 4310384576

copy はオブジェクトをコピーする関数です。コピーすると、メモリ空間に違うオブジェクトがつくられます。

リストを複雑に処理するときは、代入とコピーのどちらが適切かいつも考える必要があります。代入は「リストが上書きされるリスク」をはらみます。