プログラミングでは、2つの変数に格納されている値を互いに入れ替えたい(スワップしたい)場面があります。例えば、並び替え(ソート)アルゴリズムを実装する際などです。
目次
伝統的な方法(一時変数の使用)
多くのプログラミング言語では、2つの変数の値を入れ替えるために、3つ目の一時的な変数(temp や tmp と呼ばれることが多い)を使用する必要があります。
width = 800
height = 600
print(f"入れ替え前: 幅={width}, 高さ={height}")
# 1. width の値を一時変数 temp に退避
temp = width
# 2. width に height の値を代入
width = height
# 3. height に退避しておいた temp (元の width) の値を代入
height = temp
print(f"入れ替え後: 幅={width}, 高さ={height}")
実行結果:
入れ替え前: 幅=800, 高さ=600
入れ替え後: 幅=600, 高さ=800
この方法は確実ですが、3行のコードと追加の変数が1つ必要となり、やや冗長です。
Python的な解決策(多重代入)
Pythonでは、この変数の入れ替えを、一時変数を使わずに1行で、かつ直感的に記述する構文が用意されています。
これは「多重代入」または「タプルのアンパック」と呼ばれる機能を利用したものです。
構文:
変数1, 変数2 = 変数2, 変数1
使用例: 先ほどの width と height の入れ替えは、Pythonでは以下のように書けます。
width = 800
height = 600
print(f"入れ替え前: 幅={width}, 高さ={height}")
# Pythonによる1行での入れ替え
width, height = height, width
print(f"入れ替え後: 幅={width}, 高さ={height}")
実行結果:
入れ替え前: 幅=800, 高さ=600
入れ替え後: 幅=600, 高さ=800
temp 変数を使った場合と全く同じ結果が、たった1行で得られました。
なぜこれが可能か
この width, height = height, width というコードは、内部的には以下のように動作しています。
- まず、右辺の
(height, width)が評価されます。この時点で(600, 800)という値のペア(タプル)が一時的にメモリ上に作成されます。 - 次に、そのタプルが左辺の変数
widthとheightにアンパック(展開)されて代入されます。 - 結果として、
widthに600が、heightに800が同時に代入されます。
右辺が評価された時点ではまだ左辺への代入は行われていないため、一時変数を使わなくても値が上書きされて消えてしまうことがありません。
3つ以上の変数の入れ替え
この構文は、3つ以上の変数を同時に(巡回させるように)入れ替える場合にも応用できます。
a = 10
b = 20
c = 30
print(f"入れ替え前: a={a}, b={b}, c={c}")
# a -> b, b -> c, c -> a のように巡回
a, b, c = b, c, a
print(f"入れ替え後: a={a}, b={b}, c={c}")
実行結果:
入れ替え前: a=10, b=20, c=30
入れ替え後: a=20, b=30, c=10
まとめ
- Pythonで2つの変数の値を入れ替える(スワップする)場合、
temp変数を使う伝統的な方法も可能ですが、推奨されません。 a, b = b, aという多重代入の構文を使うことで、コードを1行で簡潔に、かつ効率的に記述できます。
