В Python
a, b = b, a
эффективно обменивает значения от a
и b
. Точнее, имя a
теперь будет ссылаться на значение, которое ранее ссылалось на b
и наоборот.
Это называется упаковкой/распаковкой кортежа. В запятой строятся кортежи; то обмен производится =
.
Что происходит «за кулисами», заключается в следующем:
- Кортеж
b, a
оценивается. Вы можете представить, что результат этой оценки хранится в неназванной временной переменной. Назовем эту переменную temp
.
- Оператор присваивания
=
теперь приводит к присвоению имен temp
именам, расположенным слева от =
. Если бы было только одно имя слева, как в x = b, a
, то x
был бы назначен кортеж b, a
.
- Поскольку с левой стороны расположено несколько имен,
temp
будет «распакован» в эти имена в последовательности.
a
будет присвоено значение temp[0]
(который содержит значение, которое b
указал на), и b
будет присвоено значение temp[1]
.
Обратите внимание, что количество имен с обеих сторон должны совпадать:
>>> a = 1
>>> b = 2
>>> c = 3
>>> a, b = c, b, a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 2)
Но вы можете использовать оператор кортеж УПАКОВКИ *
сказать Python, чтобы упаковать оставшиеся значения в одно имя:
>>> a, *b = c, b, a
>>> a
3
>>> b
[2, 1]
@Stefano Вы избили меня до него. Я форматировал, когда увидел результат. :) –