Python 对函数参数和操作数的求值顺序是否确定(+ 在何处记录)?
Is Python's order of evaluation of function arguments and operands deterministic (+ where is it documented)?
C 没有 guarantee any evaluation order,所以像 f(g1()+g2(), g3(), g4())
这样的语句可能会在 g1()
、g2()
、g3()
和 g4()
中执行任何订单(尽管 f()
将在所有订单之后执行)
那Python呢?我对 Python 2.7 的实验表明它似乎是从左到右的评估顺序,但我想知道是否指定了这种情况。
测试程序:
def somefunc(prolog, epilog):
print prolog
def f(a, b, *args):
print epilog
return f
def f(text):
print text
return 1
somefunc('f1','f2')(f('hey'),f('ho'),f('hahaha'),f('tweedledee')+f('tweedledum'))
打印
f1
hey
ho
hahaha
tweedledee
tweedledum
f2
是的,从左到右的评估顺序是有保证的,作业除外。记录在此处 (py2, py3):
Python evaluates expressions from left to right. Notice that while evaluating an assignment, the right-hand side is evaluated before the left-hand side.
In the following lines, expressions will be evaluated in the arithmetic order of their suffixes:
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
如果语言没有对此做出选择,一个参数的评估可能会改变另一个参数并导致未指定的行为,因此 Python 的所有实现都必须遵循此规范。
https://docs.python.org/3/reference/expressions.html#evaluation-order:
Python evaluates expressions from left to right. Notice that while
evaluating an assignment, the right-hand side is evaluated before the
left-hand side.
In the following lines, expressions will be evaluated in the
arithmetic order of their suffixes:
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
C 没有 guarantee any evaluation order,所以像 f(g1()+g2(), g3(), g4())
这样的语句可能会在 g1()
、g2()
、g3()
和 g4()
中执行任何订单(尽管 f()
将在所有订单之后执行)
那Python呢?我对 Python 2.7 的实验表明它似乎是从左到右的评估顺序,但我想知道是否指定了这种情况。
测试程序:
def somefunc(prolog, epilog):
print prolog
def f(a, b, *args):
print epilog
return f
def f(text):
print text
return 1
somefunc('f1','f2')(f('hey'),f('ho'),f('hahaha'),f('tweedledee')+f('tweedledum'))
打印
f1
hey
ho
hahaha
tweedledee
tweedledum
f2
是的,从左到右的评估顺序是有保证的,作业除外。记录在此处 (py2, py3):
Python evaluates expressions from left to right. Notice that while evaluating an assignment, the right-hand side is evaluated before the left-hand side.
In the following lines, expressions will be evaluated in the arithmetic order of their suffixes:
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
如果语言没有对此做出选择,一个参数的评估可能会改变另一个参数并导致未指定的行为,因此 Python 的所有实现都必须遵循此规范。
https://docs.python.org/3/reference/expressions.html#evaluation-order:
Python evaluates expressions from left to right. Notice that while evaluating an assignment, the right-hand side is evaluated before the left-hand side.
In the following lines, expressions will be evaluated in the arithmetic order of their suffixes:
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