Python 赋值运算符结合性

问题描述 投票:0回答:2

考虑以下 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 语言规范中是否有关于赋值运算符的结合性的内容,或者上面示例的行为是否未定义?

我所能找到的就是表达式从左到右求值,除了在赋值时首先求r值,但这没有帮助。

python operators
2个回答
13
投票

简短回答:代码定义良好;顺序是从左到右。

长答案:

首先,让我们正确理解术语。与其他一些语言不同,Python 中的赋值是一个“语句”,而不是一个“运算符”。这意味着您不能将赋值用作另一个表达式的一部分:例如 i = (j = 0) 不是有效的 Python 代码。 赋值语句被定义为显式允许多个赋值目标(在您的示例中,这些目标是

i

a[i]

)。每个目标都可以是一个列表,但我们先把它放在一边。


当有多个赋值目标时,从左到右赋值。引用
文档

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

只是为了说清楚,因为我自己很难理解这一点。声明:

9
投票

相当于

tmp = E  # expression E evaluated once
a = tmp
b = tmp
c = tmp

© www.soinside.com 2019 - 2024. All rights reserved.