Python 文法 リスト,辞書型の代入する時に気をつけるたった1つのこと
値は値が、リストは参照が代入される
まずはコンソールで
python
を入力し、インタラクティブシェルでこちらを入力していただきたい。
>>> number = [0,1,2,3,4] >>> more_one = number >>> number[1] = 'hello' >>> number [0, 'hello', 2, 3, 4] >>> more_one [0, 'hello', 2, 3, 4]
ひょっとすると変に見えるかもしれません。
more_oneのリストしか変えていないのに、numberのリストの値も変わってしまいました。
この結果からわかることは、リストの代入の場合は値が代入されるのではなくリストの参照(IDのようなもの)が代入されるということです。
この情報だけを知ると値とリストの概念は少し違うように思えますが実は一緒です。
変数は良く箱と称されますが、値の代入の場合、値そのものが格納されます。
リストの場合は
number = [0,1,2,3,4]
ここの段階でこのリストの参照(リンク)が入り、リスト自体は別の場所へ格納されます。そしてその参照がmore_oneへ代入されます。
どうすればリスト自体をコピーできるのか?
copyモジュールのcopy()関数を使うと値自体をコピーすることができます。
以下のコードをインタラクティブシェルで実行してください。
>>> import copy >>> number = [0,1,2,3,4] >>> more_one = copy.copy(number) >>> more_one[1] = 'fix' >>> more_one [0, 'fix', 2, 3, 4] >>> number [0, 1, 2, 3, 4]
copy()関数を使うことによってnumberリストの値自体がコピーされ、どこかに保存されます。そして、more_oneに新しくコピーされた値の参照が格納されます。
リストの中にリストがある場合はdeepcopy()
リストの中にリストがあるものをコピーする場合はcopy()の代わりに、depcopy()の関数を使用する。
以下のコードをインタラクティブシェルで実行してください。
>>> team = [[0,1],[2,3,4],[5,6,7]] >>> new_team = copy.deepcopy(team) >>> new_ new_name new_team >>> new_team[0] = [10,20] >>> new_team [[10, 20], [2, 3, 4], [5, 6, 7]] >>> team [[0, 1], [2, 3, 4], [5, 6, 7]]
まとめ
変数への代入をする時は、
値の自体が代入される
リストの場合は参照が代入される。
そのため、別の変数に代入する場合も同じように参照が代入される。
値自体をコピーしたい場合はimport copyをしてcopu()関数を使用する。
以上