考虑以下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值,但这没有帮助。
答案 0 :(得分:12)
简答:代码定义明确;订单是从左到右。
答案很长:
首先,让我们把术语说得对。与其他一些语言不同,Python中的赋值是语句,而不是运算符。这意味着您不能将赋值用作另一个表达式的一部分:例如i = (j = 0)
不是有效的Python代码。
赋值语句被定义为明确允许多个分配目标(在您的示例中,这些目标是i
和a[i]
)。每个目标都可以是一个列表,但让我们把它放在一边。
如果有多个分配目标,则从左到右分配值。引用documentation:
赋值语句评估表达式列表(请记住 这可以是单个表达式或以逗号分隔的列表,后者 产生一个元组)并将每个结果对象分配给每一个 目标列表,从左到右。
答案 1 :(得分:7)
只是为了说清楚,因为我努力理解这一点。声明:
a = b = c = ... = E
相当于
a = E
b = E
c = E
...