変数と書き換え可能オブジェクト

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください