2015-11-28 5 views
5

я имел следующую строку в цикле, возникающую во время инициализации односвязного класса списка:Семантика «х = у = г» назначений в Python

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

Намеченной семантика была то, что я могу получить с :

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

То, что я узнал, используя PDB, что previous получает переназначен на новый Node объекта. И атрибут указателя (прежний) previous не изменяется.

Не удалось найти документацию о ожидаемом поведении такого рода присвоений.

ответ

4

Это хорошо описано в the documentation:

Оператор присваивания вычисляет список выражений (помните, что это может быть одно выражение или список разделенных запятыми, причем последний получают кортеж) и назначает единственный результирующий объект каждому целевых списков, слева направо.

(курсив мой)

Где термин target_list используется в грамматике следующим образом:

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

(Обратите внимание на + знак после первой скобкой - это позволяет назначения цепи)

Таким образом, полученная семантика:

target_list1 = target_list2 = expression 

эквивалентен:

target_list1 = expression 
target_list2 = expression 

Там нет никакого способа запутанных, что в настоящее время назначаются (оценивает список выражений) с тем, что является целью задания, потому что назначение является заявление, а не выражение. Следовательно, все с = в нем не будут рассматриваться как выражение - только правая часть. Затем все операции присваивания будут обрабатываться слева направо (т. Е. Их целевые списки будут иметь значение выражения).

2

Он должен назначить оба previous.pointer и previous на вновь созданный Node, эффективно и в то же время .

Я не уверен, какой из них получает назначен первый (или, если это даже определено в спецификации - хотя это должно только дело в случае дескрипторы как встроено property).

Смежные вопросы