Python赋值运算符关联性

时间:2011-10-12 09:43:56

标签: 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)  

我希望输出为:

[0, 1] 1
[1, 0] 1

但我得到了:

[1, 0] 1
[0, 1] 1

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

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

2 个答案:

答案 0 :(得分:12)

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

答案很长:

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

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

如果有多个分配目标,则从左到右分配值。引用documentation

  

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

答案 1 :(得分:7)

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

a = b = c = ... = E

相当于

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