copy
pythonではすべてのオブジェクトは参照渡しになっています。だからlist等をcopyするときには注意が必要です。
a = [0, 1, 2] b = a b[0] = 'Hello' b > ['Hello', 1, 2] a > ['Hello', 1, 2] # bを変更するとaも変更されてしまう
これを避けるには copy関数を使うか、aの要素を一つ一つbに保存する(所謂、値渡し)をすれば上手くいきます。
# copyを使用 a = [0, 1, 2] b = a.copy() b[0] = 'Hello' b > ['Hello', 1, 2] a > [0, 1, 2] #aには変化なし #aの要素を一つずつcopy b = a[:] b[0] = 'World' b > ['World', 1, 2] a > [0, 1, 2]
copyの方が字面的に何をしているのかが分かりやすい気がする。(まぁどちらを使うのかは個人の裁量です)
しかしながら更なる問題が!!
単純なlistならば上記の方法で問題ないのですが、listの中にlistがある場合などは、ただcopyするだけでは内包されるlistがまだ参照渡しであるため、以下の事象が起こります。
a = [[0, 1], [1, 2]] b = a.copy() b[0][0] = 'H' b > [['H', 1], [1, 2]] a > [['H', 1], [1, 2]] #aも変更されている
なので、こういう時はcopyモジュールのdeepcopyを用います。
import copy a = [[0, 1], [1, 2]] b = copy.deepcopy(a) b[0][0] = 'HEY' b > [['HEY', 1], [1, 2]] a > [[0, 1], [1, 2]] # aがそのまま
以上、参考までに...