結論
ValueError: not enough values to unpack (expected 3, got 2) は、右辺から受け取れる値が2個なのに、左辺で3個の変数へ分けようとしたときに発生します。
直し方は、データの個数と変数の個数を合わせることです。データの長さが変わる可能性がある場合は、* を付けた変数で残りの値をまとめて受け取れます。
検証環境
- ローカル: Python 3.14.2
- ブラウザ: 公開中のAI Work Studio(Python 3.12)
- 標準入力: 未使用
- Preview: Pythonコードのため表示対象外
以下の修正前コードと2つの修正後コードを両方の環境で実行し、エラー末尾とConsole出力が一致することを確認しました。
問題の再現
名前と点数を持つ2要素のリストを、name、score、level の3変数へ分けようとします。
修正前コード
record = ["Aki", 80]
name, score, level = record
print(name, score, level)
実行すると、2行目で処理が止まります。
ValueError: not enough values to unpack (expected 3, got 2)
expected 3 は左辺が3個の値を要求したこと、got 2 は右辺から実際に得られた値が2個だったことを示します。
原因
name, score, level = record のように、シーケンスの各要素を複数の変数へ一度に代入する操作をアンパックと呼びます。
Python公式チュートリアルでは、通常のシーケンスアンパックは左辺の変数と右辺の要素が同じ数である必要があると説明されています。代入文のリファレンスでも、* 付きの変数がない場合、右辺は左辺と同じ個数の要素を持つ必要があります。
今回の record は ["Aki", 80] の2要素です。3個目の level に渡す値がないため、ValueError になります。
修正後コード:変数を2個に合わせる
データが名前と点数の2項目だと決まっているなら、受け取る変数も2個にします。
record = ["Aki", 80]
name, score = record
print(f"名前: {name}")
print(f"点数: {score}")
実行結果
名前: Aki
点数: 80
ローカルとAI Work Studioで、この2行と終了コード0を確認しました。
修正後コード:残りを * で受け取る
先頭だけを必須項目にし、残りの個数が変わる場合は、変数名の前に * を付けます。
record = ["Aki", 80]
name, *details = record
print(f"名前: {name}")
print(f"残り: {details}")
実行結果
名前: Aki
残り: [80]
details には残りの要素がリストで入ります。右辺が1要素だけなら空のリストになり、2要素以上なら2個目以降が順番に入ります。
よくある間違い
- 使わない値を
_で受けても、個数の条件は変わりません。name, score, _ = recordも、2要素しかなければ同じエラーです。 -
try/except ValueErrorだけで処理を続け、データの項目不足を見逃す。まず入力データの仕様を確認します。 -
too many values to unpackと混同する。not enoughは値が不足、too manyは値が多すぎる状態です。 - 長さが変わるデータを固定個数の変数へ分ける。必要な先頭項目だけを指定し、残りは
*detailsで受け取ります。
まとめ
not enough values to unpack が出たら、エラーの expected と got を確認し、左辺の変数数と右辺の要素数を比べます。個数が固定なら変数を合わせ、可変なら * 付きの変数を使うのが基本です。
同じコードは、AI Work Studio のPythonタブでも実行できます。