Python赋值运算符的结合性

14

考虑以下 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-value,但这并没有提供帮助。


1
有趣的是,你的例子与本节末尾的示例非常相似。 - Jeff Mercado
2个回答

13

简短回答: 代码是明确定义的,按从左到右的顺序执行。

详细回答:

首先,让我们搞清术语。与其他一些语言不同,Python中的赋值是一个“语句”,而不是一个“运算符”。这意味着您不能将赋值用作另一个表达式的一部分:例如,i =(j = 0)不是有效的Python代码。

赋值语句被定义为明确允许多个赋值目标(在您的示例中,这些是ia [i] )。每个目标可以是列表,但暂且不谈。

当存在多个赋值目标时,值是从左到右赋值的。引用文档

  

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


9
只是为了让大家更明白,因为我自己也曾经很难理解这个问题。这个声明的意思是:
a = b = c = ... = E

等同于

a = E
b = E
c = E
...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接