Python中'x = y = z'赋值的语义

时间:2015-11-28 01:46:59

标签: python

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

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

我可以通过以下方式获得预期的语义:

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

我使用pdb发现的是previous被重新分配给新的Node对象。而且(前)previous的指针属性没有变化。

我找不到关于此类任务的预期行为的文档。

2 个答案:

答案 0 :(得分:4)

the documentation

对此进行了详细解释
  

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

(强调我的)

语法中使用术语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分配previousNode,同时 1

1 我不确定首先分配哪一个(或者甚至是否由规范定义 - 尽管它应该只是在描述符就像内置property)。