在作业之前是否始终评估作业的右侧?

Kos*_*nov 3 python operator-precedence undefined-behavior python-2.7

这是一段代码片段.

x = {}
x[1] = len(x)

print x
{1: 0}
Run Code Online (Sandbox Code Playgroud)

这个定义得很好吗?也就是说,可以x == {1: 1}呢?

因为我记得C++ '98中的等效程序(如果我们使用std::map)具有未定义的行为.使用VS编译器和G ++编译时,程序的输出是不同的.

Bil*_*nch 8

正如我在评论中提到的,这个测试用例可以简化为:

x = {}
x[1] = len(x)
Run Code Online (Sandbox Code Playgroud)

那么问题就变成了,是x[1] == 0,或者是x[1] == 1

让我们看看相关的2.x文档3.x文档:

Python从左到右评估表达式.请注意,在评估分配时,右侧在左侧之前进行评估.

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

expr3, expr4 = expr1, expr2
Run Code Online (Sandbox Code Playgroud)

因此...

len(x)在我们做之前将完全计算x[1],所以x[1] == 0这是明确定义的.