在单向链表类初始化期间的循环中,我有以下行:
previous = previous.pointer = Node(item, None)
我可以使用以下内容获得所需的语义:
previous.pointer = Node(item, None)
previous = previous.pointer
我使用pdb发现
previous
被重新赋值为新的Node
对象。而(以前的)previous
的指针属性没有改变。我找不到关于这种赋值预期行为的文档。
在单向链表类初始化期间的循环中,我有以下行:
previous = previous.pointer = Node(item, None)
我可以使用以下内容获得所需的语义:
previous.pointer = Node(item, None)
previous = previous.pointer
previous
被重新赋值为新的Node
对象。而(以前的)previous
的指针属性没有改变。这在文档中有很好的解释:
赋值语句评估表达式列表(记住,这可以是单个表达式或逗号分隔的列表,后者产生一个元组),并将单个结果对象从左到右分配给每个目标列表。
(强调是我的)
在语法中,术语target_list
的用法如下:
assignment_stmt ::= (target_list "=")+ (expression_list | yield_expression)
(注意第一个括号后面的+
符号 - 这允许链式赋值)
因此,其结果语义如下:
target_list1 = target_list2 = expression
等同于:
target_list1 = expression
target_list2 = expression
无论如何,被赋值的内容(评估表达式列表)与赋值的目标是不会混淆的,因为赋值是一个语句,而不是一个表达式。因此,所有带有=
的内容都不会被视为表达式 - 只有最右边的部分。接下来,所有赋值语句将从左到右处理(即它们的目标列表将被分配表达式的值)。
它应该同时将previous.pointer
和previous
分配给新创建的Node
,实际上是同时进行的1。
1我不确定哪个会被先分配(或者是否由规范定义 - 尽管这只在描述符的情况下才有影响,例如内置的property
)。