一行中的 Python 多个赋值语句

标签 python variable-assignment

(别担心,这不是关于解包元组的另一个问题。)

在 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. In foo = bar = 5, there are two (target_list "=") productions, and the expression_list part is just 5

赋值语句中的所有 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/

相关文章:

python - Python 中的 if 和 else 条件问题

java - 为什么不能将两个字节加一个整数并可以将两个最后字节加一个字节?

C 代码似乎放错了用 fscanf 读取的值

python - MySQLdb/Python/LocalHost - 查询运行没有错误,但没有结果

python - Pandas - 根据多种条件更新列 - 按方法分组

python - Pandas 获得最高点积的索引

c++ - 指向二维数组的特定行

c - 如果我们使用 = 运算符而不是 memcpy() 分配不同的结构会怎么样

c# - 变量赋值和读取是原子操作吗?

Python - 使用 Osmnx 包获取 "TypeError: argument of type ' CRS' 不可迭代