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

时间:2014-11-24 19:28:50

标签: python python-2.7 undefined-behavior operator-precedence

以下是代码段。

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

print x
{1: 0}

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

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

2 个答案:

答案 0 :(得分:8)

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

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

接下来的问题是x[1] == 0,还是x[1] == 1

让我们看一下相关的2.x documentation3.x documentation

  

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

     

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

expr3, expr4 = expr1, expr2

因此...

len(x)将在我们执行x[1]之前完全计算,因此x[1] == 0已明确定义。

答案 1 :(得分:0)

是的,已经定义了。在分配之前调用len()。但是,dict不是在Python中排序的,这就是为什么有时在输出中看到0,1和1,0的原因。