Python的函数参数和操作数的评估顺序是否具有确定性(+在哪里记录)?

时间:2017-09-18 21:42:02

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

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

2 个答案:

答案 0 :(得分:12)

是的,保证从左到右的评估顺序,但作业除外。这里记录了这些内容(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的所有实现都必须遵循此规范。

答案 1 :(得分:3)

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.