(别担心,这不是关于解包元组的另一个问题。)
在 python 中,像 foo = bar = baz = 5
这样的语句将变量 foo、bar 和 baz 分配给 5。它从左到右分配这些变量,这可以通过更糟糕的例子来证明,比如
>>> 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 语言参考 指出赋值语句具有以下形式
(target_list "=")+ (expression_list | yield_expression)
在赋值时,首先评估 expression_list
,然后进行赋值。
那么 foo = bar = 5
行怎么可能有效,因为 bar = 5
不是 expression_list
?如何解析和评估一行中的这些多个分配?我读错了语言参考吗?
原文由 mwcvitkovic 发布,翻译遵循 CC BY-SA 4.0 许可协议
所有功劳归功于@MarkDickinson,他在评论中回答了这个问题:
赋值语句中的所有
target_list
作品(即看起来像foo =
的东西)从左到右分配给expression_list
的右端语句,在expression_list
得到评估之后。当然,通常的“元组解包”赋值语法也适用于此语法,让您可以执行诸如