読者です 読者をやめる 読者になる 読者になる

Weekly Report

途中で寝てももいいよね,ゆとりだもんね

Pythonにおける引数の評価順序

関数呼び出しにおける引数の評価順序は,プログラミング言語によっていろいろと規定されている.

C言語 (C99)

例えばC言語 (C99)では,実引数の評価順序は未規定である.

これは推測だが,C言語コンパイラの実装の手間の軽減や,最適化の余地を残すための規定なのだろう. この規定から,評価順序に依存するようなCのプログラムを書くべきでないことがわかる.

Python (CPython)

ところで,Pythonではどうなのだろうか? 先に検索して,答えを調べてしまうのも良いかもしれない. しかし,せっかくインタプリタが手元にあるのだから,動かして調べてみよう.

バージョン

> python -V
Python 3.4.3

実験

>>> p = lambda s: print(s)

>>> def f(x, y=2, *args, z=3, **kwargs): pass

>>> f(p(1), p(2), p(3), z=p(4), w=p(5))
1
2
3
4
5
>>> f(n, globals().update({'n': 1}))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'n' is not defined

>>> f(globals().update({'n': 1}), n)

>>> n
1

どうやら,左から右に評価されるようだ.

答え

ドキュメントによると,左から右 (left to right)に評価されると記述されている. ここに載っている例が,評価順序を明瞭に表している.

expr1, expr2, expr3, expr4
(expr1, expr2, expr3, expr4)
{expr1: expr2, expr3: expr4}
expr1 + expr2 * (expr3 - expr4)
expr1(expr2, expr3, *expr4, **expr5)
expr3, expr4 = expr1, expr2

記事を書いた時間

35分