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

Как работает оператор запятой Python во время назначения?

Я читал инструкции присваивания в документах Python (http://docs.python.org/reference/simple_stmts.html#assignment-statements).

В этом цитируется, что:

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

После прочтения я подумал о написании такого примера:

a = 5
b = 4
a, b = a + b, a
print a, b

Мое предположение заключалось в том, что a и b оба должны иметь значение 9.

Однако я ошибаюсь. "a" имеет значение 9 и "b" имеет значение 5.

Может кто-нибудь помочь мне понять это лучше? Почему старое значение "a" назначено, а не новое? Как в документах, значение будет присвоено в первую очередь? Я что-то пропустил?

4b9b3361

Ответ 1

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

Из учебника Python: первые шаги по программированию:

Первая строка содержит множественное присвоение: переменные a и b одновременно получают новые значения 0 и 1. В последней строке это используется снова, демонстрируя, что выражения в правой части оцениваются прежде чем произойдет какое-либо из заданий. Выражения правой стороны оцениваются слева направо.

Акцент на мой.

Ваш код функционально эквивалентен следующему:

a, b = 5 + 4, 5
print a, b

Ответ 2

Python не имеет "оператора запятой", как в C. Вместо этого запятая указывает, что должен быть построен кортеж. Правая часть

a, b = a + b, a

является кортежем с двумя элементами a + b и a.

В левой части задания запятая указывает, что последовательность распаковки должна выполняться в соответствии с указанными вами правилами: a будет назначен первый элемент кортежа, b второй.

Ответ 3

Вы можете думать о том, что задания выполняются параллельно на копиях, а не последовательно и на месте.

Вот почему в python вам не нужна функция подкачки:

a, b = b, a

работает достаточно, не требуя временной переменной, c.