Python赋值运算符的结合性

14 投票
2 回答
1210 浏览
提问于 2025-04-17 04:09

考虑以下这个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中是无效的。

赋值语句被定义为可以同时给多个目标赋值(在你的例子中,这些目标是 ia[i])。每个目标可以是一个列表,但我们先不讨论这个。

当有多个赋值目标时,值是从左到右进行赋值的。引用一下文档中的内容:

一个赋值语句会计算表达式列表(记住,这可以是一个单一的表达式,也可以是用逗号分隔的列表,后者会生成一个元组),并将得到的单一结果对象从左到右赋值给每个目标列表。

撰写回答