Значение отчета о назначении - PullRequest
16 голосов
/ 10 августа 2011

Всем известно, что в Python присваивания не возвращают значение, предположительно, чтобы избежать присваиваний в операторах if, когда обычно предполагается только сравнение:

>>> if a = b:
  File "<stdin>", line 1
    if a = b:
         ^
SyntaxError: invalid syntax

>>> if a == b:
...     pass
...

По той же причине можно предположить, чтомножественные присваивания одного и того же оператора также были синтаксическими ошибками.

На самом деле a = (b = 2) не является допустимым выражением:

>>> a = (b = 2)
  File "<stdin>", line 1
    a = (b = 2)
           ^
SyntaxError: invalid syntax

Итак, мой вопрос: почему a = b = 2 работает вPython, как он работает на других языках, где операторы присваивания имеют значение, например C?

>>> a = b = c = 2
>>> a, b, c
(2, 2, 2)

Документировано ли это поведение?Я не смог найти ничего об этом в документации по операциям присваивания: http://docs.python.org/reference/simple_stmts.html#assignment-statements

Ответы [ 3 ]

24 голосов
/ 10 августа 2011

Это прямо в синтаксисе:

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

Крошечный + в конце (target_list "=")+ означает «один или несколько».Таким образом, строка a = b = c = 2 состоит не из 3 операторов присваивания, а из одного оператора присваивания с 3 целевыми списками.

Каждый целевой список в свою очередь состоит только из одной целевойидентификатор в данном случае).

Это также в тексте (выделено мной):

Оператор присваивания [...] присваивает один результирующий объект каждому изсписки целей , слева направо.

Это может привести к интересным результатам:

>>> (a,b) = c = (1,2)
>>> (a, b, c)
(1, 2, (1, 2))
0 голосов
/ 20 апреля 2013

Еще один прекрасный пример:

>>a,b,c  = b = 1,2,3
>>b
(1, 2, 3)
0 голосов
/ 11 августа 2011
a = b = c = 2
b = 3
print a,b,c
>>> 2 3 2
...