Python

Pythonの引数はすべて参照渡し

More than 3 years have passed since last update.

らしい。知らんかったよ。

というか、あまり気にしてなかった。

intあたりは、挙動からみて特別扱いで値渡しなのかなーと思ってたら、「すべて」参照渡しだったのね。

以下、ipython での実験。

In [27]: i = 1

In [28]: id(i)
Out[28]: 140513240953112

In [29]: def func(a):
....: print a, id(a)
....: a += 1
....: print a, id(a)
....: return a
....:

In [30]: b = func(i)
1 140513240953112 <- ここまでは同じ場所(id)を参照している
2 140513240953088 <- ここで別場所(id)へコピーされた

In [31]: id(b)
Out[31]: 140513240953088

もう一例

In [32]: i = 1

In [33]: id(i)
Out[33]: 140513240953112

In [34]: def func(a):
....: print a, id(a)
....: return a
....:

In [35]: b = func(i)
1 140513240953112

In [36]: id(b)
Out[36]: 140513240953112 <- ここでもiと同じ場所(id)を参照している

In [37]: b
Out[37]: 1 <- iと同じ場所から読み出している

In [38]: b += 2 <- ここで別場所(id)へコピーされた

In [39]: id(b)
Out[39]: 140513240953064 <- ほら変わってる

へぇ。そういうことなのね。


参考


所感

pythonで頑張ってチューニングしてみたら、Arrayインデックス経由の参照コストが最後までネックになってしまった。んー、pythonに精通していれば、まだやりようはあるのかも知れないけど、pythonで頑張るくらいなら言語変えたほうが早いよねーというのもあるから、なかなかpythonの深い部分へは潜る必要性がない。興味はあるんだけど。

言語変更の選択肢として、今は安易にC/C++に行ってしまうけど、Go言語をもっとテキパキ使えるようにしておくことが必要だよねー、とは思ってる。思ってはいる。ほんとに。

おわり。