なんとなく生きてます

雑記帳備忘録チラシの裏

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な型はその名前通り, 一度領域を確保するとその値を書き換えることができないため, 値を変更する際は新たな領域が確保される.