参照の共有とShallow copy
Pythonでリストを扱うときの注意点
リストが格納された変数を別の変数に代入した場合、コピーが作成されるわけではなく参照の共有が行われる。
リストの参照の共有
例えば、下記のようなコードがあるとする。
x = [1, 2, 3]
y = x
y.append(4)
print(f"x: {x} id: {id(x)}")
print(f"y: {y} id: {id(y)}")
このとき、xとyは同じリストオブジェクトを参照することになるため、yを通じてリストオブジェクトを変更すると、その変更はxから参照した場合にも反映される。
$ python3 main.py
x: [1, 2, 3, 4] id: 140104591788864
y: [1, 2, 3, 4] id: 140104591788864
Shallow copy
元のリストを変更したくない場合は、copy()メソッドを利用する。
copy()を利用すると、リストのShallow copyが作成され、その新しいリストへの参照がyに代入される。
y = x.copy()
すると同じようにappend()を実行した場合でもxは変更されず、yのみ値が追加される。
$ python3 main.py
x: [1, 2, 3] id: 139896526244672
y: [1, 2, 3, 4] id: 139896526246528