Python中“x = y = z”赋值的语义

6

在单向链表类初始化期间的循环中,我有以下行:

previous = previous.pointer = Node(item, None)

我可以使用以下内容获得所需的语义:

previous.pointer = Node(item, None)
previous = previous.pointer

我使用pdb发现previous被重新赋值为新的Node对象。而(以前的)previous的指针属性没有改变。
我找不到关于这种赋值预期行为的文档。
2个回答

4

这在文档中有很好的解释:

赋值语句评估表达式列表(记住,这可以是单个表达式或逗号分隔的列表,后者产生一个元组),并将单个结果对象从左到右分配给每个目标列表。

(强调是我的)

在语法中,术语target_list的用法如下:

assignment_stmt ::=  (target_list "=")+ (expression_list | yield_expression)

(注意第一个括号后面的+符号 - 这允许链式赋值)

因此,其结果语义如下:

target_list1 = target_list2 = expression

等同于:

target_list1 = expression
target_list2 = expression

无论如何,被赋值的内容(评估表达式列表)与赋值的目标是不会混淆的,因为赋值是一个语句,而不是一个表达式。因此,所有带有=的内容都不会被视为表达式 - 只有最右边的部分。接下来,所有赋值语句将从左到右处理(即它们的目标列表将被分配表达式的值)。


2

它应该同时将previous.pointerprevious分配给新创建的Node,实际上是同时进行的1

1我不确定哪个会被先分配(或者是否由规范定义 - 尽管这只在描述符的情况下才有影响,例如内置的property)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接