萬九郎の硬い船

プログラミング学習記録など

Pythonの参照について

Pythonのリストや辞書では、それらへの「参照」が変数に格納される。

mame = 3
uma = mame
mame = 6

とした場合は、mameに代入された値3がumaにコピーされ、その後でmameに別の値6を代入してもumaの値3は変わらない。 mameumaは異なる値を格納する異なる変数である。しかし、リストや辞書の場合は事情が違ってくる。

mame = [0, 1, 2, 3, 4, 5, 6]
uma = mame
uma.pop(-1)

こうした場合、uma.pop(-1)でumaの最後の要素を削除するとmameの内容も同じく変わる。 これは、リストや辞書の場合は「リスト・辞書への参照」のみが変数に格納されるからである。mameumaには同じリストへの異なる参照が格納されていることになる。 もし参照ではなく元のリストに変更を加えずに保存しておきたい場合は、copyモジュールのcopy()とdeepcopy()を使う。

import copy
mame = [0, 1, 2, 3, 4, 5, 6]
uma = copy.copy(mame)
uma.pop(-1)

こうすると、mameumaはそれぞれ異なるリストを参照するようになり、mameをコピーしたumaに変更を加えてもmameは変更されない。 リストがリストを内包する場合は、deepcopy()でコピーすれば内包されたリストのコピーも作られる。