(Не волнуйтесь, это не вопрос о распаковке кортежей.)
В python оператор типа foo = bar = baz = 5
присваивает переменные foo, bar и baz равным 5. Он присваивает эти переменные слева направо, что может быть доказано более непримиримыми примерами, например
>>> foo[0] = foo = [0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'foo' is not defined
>>> foo = foo[0] = [0]
>>> foo
[[...]]
>>> foo[0]
[[...]]
>>> foo is foo[0]
True
Но ссылка на язык python утверждает, что операторы присваивания имеют форму
(target_list "=")+ (expression_list | yield_expression)
и при присваивании сначала выполняется оценка expression_list
, а затем выполняется присваивание.
Итак, как может быть строка foo = bar = 5
, учитывая, что bar = 5
не является expression_list
? Как эти множественные присвоения на одной строке анализируются и оцениваются? Я неправильно читаю ссылку на язык?