Ассоциативность оператора присваивания Python

#python #operators

#python #операторы

Вопрос:

Рассмотрим следующую программу на Python3:

 a = [0, 0]  
i = 0  
a[i] = i = 1  
print(a, i)  

a = [0, 0]  
i = 0  
i = a[i] = 1  
print(a, i)  
  

Я ожидал, что результат будет:

 [0, 1] 1
[1, 0] 1
  

Но вместо этого я получил:

 [1, 0] 1
[0, 1] 1
  

Мой вопрос: есть ли что-нибудь в спецификации языка Python об ассоциативности оператора присваивания или поведение для приведенного выше примера не определено?

Все, что я смог найти, это то, что выражения вычисляются слева направо, за исключением того, что r-значение вычисляется первым в случае присваивания, но это не помогает.

Комментарии:

1. Интересно, что ваш пример очень похож на пример в конце раздела .

Ответ №1:

Краткий ответ: код четко определен; порядок слева направо.

Длинный ответ:

Прежде всего, давайте разберемся с терминологией. В отличие от некоторых других языков, присваивание в Python — это оператор, а не оператор. Это означает, что вы не можете использовать присваивание как часть другого выражения: например i = (j = 0) , недопустимый код Python.

Оператор присваивания определен так, чтобы явно разрешать несколько целевых объектов назначения (в вашем примере это i and a[i] ). Каждая цель может быть списком, но давайте оставим это в стороне.

Там, где имеется несколько целевых объектов присваивания, значение присваивается слева направо. Чтобы процитировать документацию:

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

Ответ №2:

Просто чтобы прояснить, поскольку я изо всех сил пытался понять это. Утверждение:

 a = b = c = ... = E
  

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

 a = E
b = E
c = E
...