Pythonの引数は参照渡しだけど値渡しに見えることがある
例を示す.
Python 2.7.12 (default, Nov 19 2016, 06:48:10) [GCC 5.4.0 20160609] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> ls = [0, 0, 0] >>> def hoge(lst): ... lst[0] = 1 ... return lst ... >>> hoge(ls) [1, 0, 0] >>> ls [1, 0, 0]
かと思いきや,
>>> i = 0 >>> def hoge2(a): ... a = 9 ... return a ... >>> hoge2(i) 9 >>> i 0
関数名で引数の参照先の値を書き換えるときは,
値をコピーして新しい領域を確保するらしい. 前者のパターンになるのは,
immutableな型(list, dictionaryなど)で, 後者のタイプはmutableな型(int, float, tupleなど)である.
immutableな型はその名前通り, 一度領域を確保するとその値を書き換えることができないため, 値を変更する際は新たな領域が確保される.