Pythonの代入は、データに名前を紐付けることだ。Rubyとおんなじだな。だから、次のように代入した場合、変数l1とl2は同じリストオブジェクトに紐づいている。
>>> l1 = [1,2,3,4,5] >>> l2 = l1
だからl1を変更すると、同時にl2も変更されたことになる。
>>> l1.append(6) >>> l1 [1, 2, 3, 4, 5, 6] >>> l2 [1, 2, 3, 4, 5, 6]
これは書き換え可能オブジェクトに共通する問題。書き換え可能オブジェクトとはリスト、辞書、setなど。一方で数値や文字列は書き換え可能ではないので、こういう問題は起きない(操作すると必ず新しいオブジェクトが作られる)。
この問題を回避するにはオブジェクトのコピーを作ればいい。コピーをつくるにはcopyモジュールのcopy関数を使う。
>>> import copy >>> l1 = [1,2,3,4,5] >>> l2 = copy.copy(l1) >>> l1.append(6) >>> l1 [1, 2, 3, 4, 5, 6] >>> l2 [1, 2, 3, 4, 5]
ところで、文字列が書き換え可能ではないというのは、Rubyとは違う点だ。たとえばリストではインデックスを利用した代入ができるが、
>>> l = [1,2,3,4,5] >>> l[0] = 0 >>> l [0, 2, 3, 4, 5]
文字列ではできない。
>>> s = "abcde" >>> s[0] = "A" Traceback (most recent call last): File "", line 1, in TypeError: 'str' object does not support item assignment