#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
...