在单链接列表类的初始化期间,我在循环中有以下行:
previous = previous.pointer = Node(item, None)
我可以通过以下方式获得预期的语义:
previous.pointer = Node(item, None)
previous = previous.pointer
我使用pdb发现的是previous
被重新分配给新的Node
对象。而且(前)previous
的指针属性没有变化。
我找不到关于此类任务的预期行为的文档。
答案 0 :(得分:4)
赋值语句评估表达式列表(请记住,这可以是单个表达式或以逗号分隔的列表,后者产生元组)并且将赋予单个结果对象 目标列表,从左到右。
(强调我的)
语法中使用术语target_list
如下:
assignment_stmt ::= (target_list "=")+ (expression_list | yield_expression)
(注意第一个括号后的+
符号 - 这允许链分配)
因此,产生的语义:
target_list1 = target_list2 = expression
相当于:
target_list1 = expression
target_list2 = expression
没有办法混淆分配的内容(评估表达式列表)与赋值的目标是什么,因为赋值是语句,而不是表达。因此,其中包含=
的所有内容都不会被视为表达式 - 只有最正确的部分。接下来,将从左到右处理所有赋值语句(即,它们的目标列表将分配表达式的值)。
答案 1 :(得分:2)
它应该同时为新创建的previous.pointer
分配previous
和Node
,同时 1 。
1 我不确定首先分配哪一个(或者甚至是否由规范定义 - 尽管它应该只是在描述符就像内置property
)。