以下是代码段。
x = {}
x[1] = len(x)
print x
{1: 0}
这个定义得很好吗?也就是说,可以x == {1: 1}
代替吗?
因为我记得C ++ '98中的等效程序(如果我们使用std::map
)具有未定义的行为。使用VS编译器和G ++编译时,程序的输出是不同的。
答案 0 :(得分:8)
正如我在评论中提到的,这个测试用例可以简化为:
x = {}
x[1] = len(x)
接下来的问题是x[1] == 0
,还是x[1] == 1
?
Python从左到右评估表达式。请注意,在评估分配时,右侧会在左侧之前进行评估。
在以下几行中,表达式将按其后缀的算术顺序进行评估:
expr3, expr4 = expr1, expr2
len(x)
将在我们执行x[1]
之前完全计算,因此x[1] == 0
已明确定义。
答案 1 :(得分:0)
是的,已经定义了。在分配之前调用len()
。但是,dict
不是在Python中排序的,这就是为什么有时在输出中看到0,1和1,0的原因。