(别担心,这不是关于解包元组的另一个问题。)
在 python 中,像 foo = bar = baz = 5
这样的语句将变量 foo、bar 和 baz 分配给 5。它从左到右分配这些变量,正如 nastier 所证明的那样像
>>> foo[0] = foo = [0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'foo' is not defined
>>> foo = foo[0] = [0]
>>> foo
[[...]]
>>> foo[0]
[[...]]
>>> foo is foo[0]
True
但是 python language reference声明赋值语句的形式为
(target_list "=")+ (expression_list | yield_expression)
在赋值时,首先对 expression_list
求值,然后进行赋值。
既然 bar = 5
不是 expression_list
,那么 foo = bar = 5
行怎么可能有效呢?如何解析和评估一行上的这些多个分配?我读错了语言引用吗?
最佳答案
所有功劳归于@MarkDickinson,他在评论中回答了这个问题:
Notice the
+
in(target_list "=")+
, which means one or more copies. Infoo = bar = 5
, there are two(target_list "=")
productions, and theexpression_list
part is just5
赋值语句中的所有 target_list
产生式(即看起来像 foo =
的东西)从左到右分配给 expression_list
在语句的右端,在 expression_list
被评估之后。
当然,通常的“元组解包”赋值语法也适用于这种语法,让您可以做类似的事情
>>> foo, boo, moo = boo[0], moo[0], foo[0] = moo[0], foo[0], boo[0] = [0], [0], [0]
>>> foo
[[[[...]]]]
>>> foo[0] is boo
True
>>> foo[0][0] is moo
True
>>> foo[0][0][0] is foo
True
关于一行中的 Python 多个赋值语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32156515/