Подтвердить что ты не робот

Ассоциативность операторов присваивания 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 о ассоциативности оператора присваивания, или это поведение для приведенного выше примера undefined?

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

a = b = c = ... = E

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

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