Обмен значений переменных

Обмен значений двух переменных - это "действие", в результате которого одна переменная принимает значение, равное второй переменной, а вторая - первой.

Понятно, что если попытаться сделать такой обмен "по-простому", т. е. сначала первой переменной присвоить значение второй, а второй - значение первой, то ничего не получится. Допустим, есть две переменные a и b. При этом a = 5 и b = 6. Если выполнить выражение a = b, то переменная a будет ссылаться на число 6, также как и b. Число 5 будет утеряно, т. к. на него уже не будет ссылаться ни одна переменная, и выражение b = a бессмысленно, т. к. b будет присвоено его же текущее значение (6 в данном случае).

Поэтому во многих языках программирования (например, Pascal) приходится вводить третью переменную, играющую роль буфера (ее иногда называют буферной переменной). В этой переменной сохраняют значение первой переменной, потом первой переменной присваивают значение второй, в новое значение для второй переменной берут из буфера. Поэтому алгоритм обмена значений двух переменных выглядит примерно так:

a = 5
b = 6
 
buf = a
a = b
b = buf

Однако есть более "хитрый" способ, позволяющий избавиться от третьей переменной. Но этим способом не всегда рекомендуют пользоваться. Выглядит он так:

a = 5
b = 7
a = a + b # 12
b = a - b # 12-7=5
a = a - b # 12-5=7

В отличие от многих других языков программирования, в Python обмен значений переменных можно выполнить вообще в одну строчку:

>>> a = 10
>>> b = 20
>>> a,b = b,a
>>> a
20
>>> b
10

Почему такое возможно? Это связано с тем, что в Питоне существует такая структура данных как кортеж.

При выполнении a,b = b,a интерпретатор Python сначала получает значения связанные с переменными b и a (правая часть) и помещает их в кортеж, в данном случае получится (10, 20). После этого он связывает каждый элемент кортежа в определенной позиции с переменной в той же позиции, но в кортеже слева (a,b).

Таким образом можно поменять значения ни только двух переменных, но и трех, четырех и т. д. Кроме того в Python можно обменять значения переменных разных типов. Такая возможность связана с тем, что тип данных в Питоне привязан не к переменной, а к значению:

>>> a = 14
>>> b = 18
>>> c = 16
>>> a,b,c = c,a,b
>>> a,b,c
(16, 14, 18)
>>> d = 4.56
>>> e = "hi"
>>> d,e = e,d
>>> d
'hi'
>>> e
4.56

Создано