考虑以下 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 中的赋值是一个“语句”,而不是一个“运算符”。这意味着您不能将赋值用作另一个表达式的一部分:例如 i = (j = 0)
不是有效的 Python 代码。
赋值语句被定义为显式允许多个赋值目标(在您的示例中,这些目标是
i
和 a[i]
)。每个目标都可以是一个列表,但我们先把它放在一边。
当有多个赋值目标时,从左到右赋值。引用
文档:
赋值语句计算表达式列表(记住 这可以是单个表达式或逗号分隔的列表,后者 产生一个元组)并将单个结果对象分配给每个 目标列表,从左到右
。只是为了说清楚,因为我自己很难理解这一点。声明:
相当于
tmp = E # expression E evaluated once
a = tmp
b = tmp
c = tmp