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]
y
が x
と同じになっています。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 はオブジェクトをコピーする関数です。コピーすると、メモリ空間に違うオブジェクトがつくられます。
リストを複雑に処理するときは、代入とコピーのどちらが適切かいつも考える必要があります。代入は「リストが上書きされるリスク」をはらみます。