Python赋值运算符的结合性
考虑以下这个Python3程序:
a = [0, 0]
i = 0
a[i] = i = 1
print(a, i)
a = [0, 0]
i = 0
i = a[i] = 1
print(a, i)
我原本期待输出是:
[0, 1] 1
[1, 0] 1
但实际上我得到了:
[1, 0] 1
[0, 1] 1
我的问题是:在Python的语言规范中,有关于赋值运算符的结合性(也就是运算的顺序)吗?还是说上面的例子行为是未定义的?
我找到的只是表达式是从左到右计算的,除了在赋值时右边的值会先计算,但这并没有帮助。
2 个回答
9
为了让大家更明白这个问题,我自己也曾经很费劲地理解过。这个语句:
a = b = c = E
其实和下面这个是一样的:
tmp = E # expression E evaluated once
a = tmp
b = tmp
c = tmp
13
简短回答:这段代码是明确的;执行顺序是从左到右。
详细回答:
首先,我们要搞清楚一些术语。在Python中,赋值是一个语句,而不是一个运算符。这意味着你不能把赋值放在其他表达式里使用,比如 i = (j = 0)
这样的写法在Python中是无效的。
赋值语句被定义为可以同时给多个目标赋值(在你的例子中,这些目标是 i
和 a[i]
)。每个目标可以是一个列表,但我们先不讨论这个。
当有多个赋值目标时,值是从左到右进行赋值的。引用一下文档中的内容:
一个赋值语句会计算表达式列表(记住,这可以是一个单一的表达式,也可以是用逗号分隔的列表,后者会生成一个元组),并将得到的单一结果对象从左到右赋值给每个目标列表。