[#] Линейные алгоритмы
vit01(mira, 1) — All
2015-12-04 04:13:41


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