[Python] 要素のスワップについてのメモ


はじめに

プログラミングの勉強としてアルゴリズム関連の本を読んでいるのですが、バブルソートか何かの話で2つの要素をスワップする際のコードを見て「そんなことできるんだ」と思ったので、関連知識も含めてのメモです。

どういうことかというと

python.py
>>> l=[1, 0]

>>> print(l)
[1, 0]

最も単純化し、こんな配列を考えてみます。この二つの要素をスワップしたいとします。
誠実な方法としては、以下のような書き方が考えられます。

python.py
>>> l[0] = temp0
>>> l[1] = temp1

>>> l[0] = temp1
>>> l[1] = temp0

>>> print(l)
[0, 1]

エレガントではないですね。
そんなとき、Pythonなら以下のように書けるということです。

python.py
>>> l[0], l[1] = l[1], l[0]

>>> print(l)
[0, 1]

#もしくは、2変数なら
>>> a, b = 1, 0
>>> a, b = b, a

>>>print(a, b)
0, 1

どういう仕組みになっているのでしょうか。
参考になりそうな記事を見つけたので紹介させていただきます。(https://www.haya-programming.com/entry/2018/09/19/195828)

3つまではスタックを用いた高速な処理を行うよう最適化されている。
4つ以上ある場合は(たぶん最適化を実装するのが面倒くさいので)tupleにしてシーケンスアンパックで処理する。

ちゃんと想定された動作のようなので、エレガントな記述を気兼ねなく使えます。

もちろん、以下のように書くと見た目通りの処理が行われるので、注意が必要です。

python.py
>>> l[0] = l[1]
>>> l[1] = l[0]

>>> print(l)
[0, 0]