2016-08-28

【備忘録】Python におけるリストの扱い

Python を使い始めてからまだ日が浅い初学者であるためか、思わぬところでとんだ間違いをしてしまうことがあります。先日 Python 2.7 で急ぎのプログラムを仕上げていて、そんなつまずきをしてしまいました。

使用環境は以下のとおりです。

  • OS: Fedora 24 (x86_64)
  • Python: python-2.7.12-2.fc24.x86_64

問題を単純化して示すと次のようになります。リストをコピーして一部の要素を変更しようとしたのですが…、

$ python
Python 2.7.12 (default, Aug  9 2016, 15:48:18) 
[GCC 6.1.1 20160621 (Red Hat 6.1.1-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a = [1, 2, 3]
>>> b = a
>>> b
[1, 2, 3]
>>> b[0] = 9
>>> b
[9, 2, 3]
>>> a
[9, 2, 3]
>>> 

この場合 a = b はリストのオブジェクトへの参照をコピーしているだけのようです。これは a, b それぞれのオブジェクトの id を調べることで確認できます。

>>> id(a)
140474693825960
>>> id(b)
140474693825960
>>> 

下記の参考サイトに納得できる解説がありましたので、備忘録として残しておきます。

参考サイト

  1. Python のリストの扱いで注意すること - Qiita
  2. 084:配列を複製する

ブログランキング・にほんブログ村へ
にほんブログ村

0 件のコメント: