【Python】a, b = b, a って何?話題の変数スワップ、その仕組みを徹底解説!🤔✨
「Python変数の入れ替え、まだこうしてない?」
TikTokの動画を見て、この記事にたどり着いた皆さん、ありがとうございます!
動画で紹介した、たった1行で2つの変数の値を入れ替えてしまう、まるで魔法のようなコード。a, b = b, a
。
「なんでこれで値が入れ替わるの?」と不思議に思ったのではないでしょうか。
この記事では、その「魔法」のタネ明かしをします。結論から言うと、これはPythonが持つ「タプル」と「アンパック」という2つの強力な機能を組み合わせた、非常にエレガントでPythonらしいテクニックなのです。
さあ、一時変数(temp
)を使っていたあの頃にはもう戻れない、スマートな変数スワップの世界を探検しましょう!
1. 復習:よくある変数の入れ替え方(コップの例え)
まず、動画の「Before」で紹介した、多くのプログラミング言語で共通する基本的な変数の入れ替え方法をおさらいしましょう。
# よくある書き方
a = 100
b = 200
print(f"入れ替え前: a = {a}, b = {b}")
# 一時的な変数tempを用意する
temp = a
a = b
b = temp
print(f"入れ替え後: a = {a}, b = {b}")
実行結果:
入れ替え前: a = 100, b = 200
入れ替え後: a = 200, b = 100
これは、よく「2つのコップの中身を入れ替える」話に例えられます。
- 水が入ったコップAと、ジュースが入ったコップBがあります。
- そのままでは中身を入れ替えられないので、空のコップ(
temp
)を用意します。 - コップAの水を、空のコップ
temp
に注ぎます。(temp = a
) - 空になったコップAに、コップBのジュースを注ぎます。(
a = b
) - 最後に、
temp
に取っておいた水を、空になったコップBに注ぎます。(b = temp
)
このように、一時的な「待避場所」として3つ目の変数を使うのが、伝統的で分かりやすい方法です。しかし、Pythonはこの手順をもっとスマートに解決してくれます。
2. Pythonの魔法の正体:「タプル」と「アンパック」
それでは、いよいよ本題のa, b = b, a
のタネ明かしです。この1行のコードは、Pythonの内部で以下の2つのステップがほぼ同時に行われることで実現されています。
ステップ1:右辺で「タプル」が作られている!
まず、Pythonは代入文の右辺、つまりb, a
の部分を評価します。この時、Pythonは「変数bの値と、変数aの値をまとめた、**タプル (tuple)** というデータ構造」を一時的に作成します。
タプルとは、複数の要素をカンマ,
で区切ってまとめたもので、リストと似ていますが、一度作成すると中身を変更できない(不変, immutable)という性質を持ちます。
a = 100
b = 200
# 右辺の b, a は、内部的に (200, 100) というタプルとして扱われる
right_side = b, a
print(f"右辺を評価した結果: {right_side}")
print(f"その型: {type(right_side)}")
実行結果:
右辺を評価した結果: (200, 100)
その型: <class 'tuple'>
つまり、a, b = b, a
の右辺では、まず(200, 100)
という「現在のbの値とaの値を格納したタプル」がメモリ上に一瞬だけ作られているのです。これが、一時変数temp
の代わりを果たしてくれます。
ステップ2:左辺で「タプルのアンパック」が行われている!
次に、Pythonは左辺を見ます。a, b
のように複数の変数がカンマ区切りで並んでいる場合、Pythonは右辺のシーケンス(今回はタプル)の各要素を、左辺の変数に順番に代入しようとします。これを「アンパック (Unpacking)」または「多重代入」と呼びます。
# タプルを用意
my_tuple = ('Taro', 25)
# タプルをアンパックして、それぞれの変数に代入
name, age = my_tuple
print(f"名前: {name}")
print(f"年齢: {age}")
実行結果:
名前: Taro
年齢: 25
ステップ3:2つのステップの合体 = 華麗なる変数スワップ!
もうお分かりですね。a, b = b, a
という1行のコードは、この2つのステップが組み合わさったものなのです。
- まず、右辺の
b, a
が評価され、一時的にタプル(200, 100)
が作られます。 - 次に、そのタプルが左辺の
a, b
にアンパック(多重代入)されます。 - タプルの最初の要素である
200
が変数a
に代入されます。 - タプルの2番目の要素である
100
が変数b
に代入されます。
重要なのは、右辺のタプルが作られる時点では、まだ左辺の変数への代入は始まっていないということです。Pythonが右辺の値をすべて評価し終えてから、左辺への代入を一気に行うため、一時変数temp
がなくても値が上書きされて消えてしまう心配がないのです。
3. なぜこれがPythonらしい(Pythonic)のか?
このa, b = b, a
という書き方は、Pythonプログラマーの間で非常に好まれる「Pythonらしい(Pythonic)」なコードの代表例です。なぜなら、
- 可読性が高い: 一時変数を使った3行のコードよりも、この1行の方が「aとbの値を入れ替えている」という意図が直接的に伝わります。
- 簡潔である: コードが短く、スッキリしています。
- 効率的である: 多くの場合、Pythonインタプリタの内部で最適化されており、一時変数を明示的に作るよりも高速に動作します。
これは、プログラミングにおける「小さな美学」のようなものですが、このようなPythonicな書き方を知っていると、コードを書くのがもっと楽しくなりますよ!
まとめ
TikTokで紹介した「魔法の1行」の謎は解けましたでしょうか?
a, b = b, a
の正体は、Pythonの「タプルの自動生成」と「シーケンスのアンパック」という2つの便利な機能を組み合わせた、非常に賢いテクニックだったのです。
このように、Pythonには一見すると不思議に見えても、その裏には合理的で美しい仕組みが隠されていることがよくあります。このブログでは、これからもそんなPythonの魅力をどんどん解説していきますので、ぜひまた遊びに来てくださいね!
今回のテクニック、あなたは知っていましたか?他にもあなたが知っているPythonのクールな一行コードがあれば、ぜひコメントで教えてください!
その他の投稿はこちら・・・Pythonの環境構築からライブラリの紹介など様々な情報があるのでぜひご覧ください✨
コメント
コメントを投稿