Как работает оператор запятой 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" назначено, а не новое? Как в документах, значение будет присвоено в первую очередь? Я что-то пропустил?
Ответы
Ответ 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
.