Python赋值运算符关联性

Iva*_*ric 12 python operators

考虑以下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)  
Run Code Online (Sandbox Code Playgroud)

我期望输出为:

[0, 1] 1
[1, 0] 1
Run Code Online (Sandbox Code Playgroud)

但相反,我得到了:

[1, 0] 1
[0, 1] 1
Run Code Online (Sandbox Code Playgroud)

我的问题是:Python语言规范中有关于赋值运算符的关联性的内容,还是上述示例的行为未定义?

我能够找到的是表达式从左到右进行评估,除了在赋值的情况下首先计算r值,但这没有帮助.

NPE*_*NPE 12

简短回答:代码定义明确; 订单是从左到右.

答案很长:

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

赋值语句被定义为明确允许多个赋值目标(在您的示例中,这些是ia[i]).每个目标都可以是一个列表,但让我们把它放在一边.

如果有多个分配目标,则从左到右分配值.引用文档:

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


Oli*_*ier 7

只是为了说清楚,因为我努力了解这一点.该声明:

a = b = c = ... = E
Run Code Online (Sandbox Code Playgroud)

相当于

a = E
b = E
c = E
...
Run Code Online (Sandbox Code Playgroud)