【问题标题】:Is Python's order of evaluation of function arguments and operands deterministic (+ where is it documented)?Python 对函数参数和操作数的求值顺序是确定性的(+ 记录在哪里)?
【发布时间】:2017-09-18 21:42:02
【问题描述】:

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

【问题讨论】:

标签: python python-3.x python-2.7 operator-precedence


【解决方案1】:

是的,从左到右的评估顺序是有保证的,但分配除外。这记录在这里(py2py3):

Python 从左到右计算表达式。请注意,在评估分配时,右侧会先于左侧进行评估。

在以下几行中,表达式将按照其后缀的算术顺序进行计算:

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 的所有实现都必须遵循此规范。

【讨论】:

    【解决方案2】:

    https://docs.python.org/3/reference/expressions.html#evaluation-order:

    Python 从左到右计算表达式。请注意,虽然 评估分配,右侧在评估之前评估 左侧。

    在以下几行中,表达式将在 后缀的算术顺序:

    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
    

    The same is true in Python 2.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-28
      • 2011-02-25
      相关资源
      最近更新 更多