Pythonでリスト(list)やタプル(tuple)を扱う際、その要素を個別の変数に取り出して使いたいことがよくあります。
例えば、座標データを扱う場合、以下のようにインデックスを指定して取り出すのが通常です。
point = (100.5, 35.2)
# 通常のインデックス参照
lat = point[0]
lon = point[1]
この方法は確実ですが、要素数が多くなると記述が冗長になります。
Pythonには、このようなシーケンス(リストやタプルなど)の要素を、一度に複数の変数に展開して代入する「アンパック(Unpacking)」という強力な機能があります。
この記事では、アンパックの基本的な使い方と、使用上の注意点について解説します。
1. 基本的なアンパック
アンパックの構文は非常にシンプルです。代入演算子(=)の左辺に、シーケンスの要素数と同じ数の変数名をカンマ区切りで並べます。
# 3つの要素を持つリスト
user_profile = ["Tanaka", 45, "Tokyo"]
# 3つの変数でアンパックする
name, age, city = user_profile
print(f"名前: {name}")
print(f"年齢: {age}")
print(f"都市: {city}")
実行結果:
名前: Tanaka
年齢: 45
都市: Tokyo
user_profile[0] が name に、user_profile[1] が age に、user_profile[2] が city に、それぞれ自動的に代入されます。この機能はタプルでも全く同じように動作します。
2. 注意点:要素数と変数名の数を一致させる (ValueError)
アンパックの基本的なルールは、「左辺の変数名の数」と「右辺のシーケンスの要素数」が厳密に一致していることです。
この数が一致しない場合、ValueError が発生し、プログラムは停止します。
エラー例1:変数の数が少なすぎる (too many values to unpack)
右辺の要素数に対して、左辺の変数名が足りない場合です。
# 3つの要素を持つリスト
rgb_color = [255, 0, 128]
# 2つの変数で受け取ろうとする
# r, g = rgb_color
# ValueError: too many values to unpack (expected 2)
Pythonは 255 を r に、0 を g に代入しましたが、128 を代入する変数が残っていないためエラーとなります。
エラー例2:変数の数が多すぎる (not enough values to unpack)
右辺の要素数に対して、左辺の変数名が多すぎる場合です。
# 3つの要素を持つリスト
rgb_color = [255, 0, 128]
# 4つの変数で受け取ろうとする
# r, g, b, alpha = rgb_color
# ValueError: not enough values to unpack (expected 4, got 3)
r, g, b には代入できましたが、alpha に代入するための4番目の要素が存在しないためエラーとなります。
3. アスタリスク (*) を使った柔軟なアンパック
前述の ValueError を回避し、より柔軟にアンパックを行うための構文として、アスタリスク(*)があります。
* を付けた変数は、残りの要素をリストとしてまとめて受け取ります。
# 複数のデータが含まれるログ
log_data = ["2025-11-14", "10:30:05", "ERROR", "Auth Failed", "User: admin"]
# 先頭の2つと、残りをすべて *details に格納
date, time, *details = log_data
print(f"日付: {date}")
print(f"時刻: {time}")
print(f"詳細 (リスト): {details}")
実行結果:
日付: 2025-11-14
時刻: 10:30:05
詳細 (リスト): ['ERROR', 'Auth Failed', 'User: admin']
* は先頭や中間に置くこともできます。
# 最初と最後だけが必要な場合
scores = [90, 85, 88, 76, 92]
first, *middle_scores, last = scores
print(f"初回スコア: {first}")
print(f"中間スコア: {middle_scores}")
print(f"最終スコア: {last}")
実行結果:
初回スコア: 90
中間スコア: [85, 88, 76]
最終スコア: 92
まとめ
- アンパック(
a, b = [1, 2])は、リストやタプルの要素を複数の変数に一括代入する機能です。 - 基本的に、左辺の変数名と右辺の要素数は一致させる必要があります。一致しない場合
ValueErrorが発生します。 *(アスタリスク)を変数名の前に付けることで、残りの要素をリストとして受け取る、柔軟なアンパックが可能です。
