集合文字和函数参数中的评估顺序保证

时间:2019-06-13 18:34:15

标签: python python-3.x python-3.6

在Python 3.6.1中,以下所有内容似乎从左到右评估:

In [1]: counter = iter(range(100))

In [2]: [next(counter), next(counter)]
Out[2]: [0, 1]

In [3]: (next(counter), next(counter))
Out[3]: (2, 3)

In [4]: next(counter), next(counter)
Out[4]: (4, 5)

In [5]: {next(counter): next(counter),
   ...:  next(counter): next(counter)}
   ...:  
Out[5]: {6: 7, 8: 9}

In [6]: print(next(counter), next(counter))
10 11

我发现listtupledict之类的集合以及函数参数以从左到右的方式评估其参数。

此行为是否得到保证,或者它是实现细节?我认为它必须是语言标准的一部分,因为否则程序将根据解释器的不同进行评估。

1 个答案:

答案 0 :(得分:1)

是的,此行为是语言标准的一部分。请参阅文档中的Evaluation order部分:

  

6.15。评估顺序

     

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

在仅关于dict文字的一个相关问题中,one answer指出CPython中的实际行为对于dict since version 2.5是不正确的,并且在{{3}中已得到修复}。