HOWTO · Python
ValueError: Nicht genügend Werte zum Entpacken in Python
Der ValueError: not enough values to unpack in Python tritt in einigen verschiedenen Szenarien auf, z. B. beim Iterieren über Wörterbuchschlüssel, aber auch beim Zugreifen auf die Werte, oder beim Nehmen von zwei Eingaben in der Eingabeanweisung, aber bei der Bereitstellung von weniger als zwei Werten, oder beim Zuweisen von weniger Werten zur erwarteten Zahl von Werten führt dazu, dass der ValueError nicht genügend Werte zum Entpacken enthält.
Auf dieser Seite
Python löst ValueError: not enough values to unpack immer dann aus, wenn eine Zuweisung oder ein Schleifenkopf mehr Variablen verlangt, als das Iterable auf der rechten Seite liefern kann. Sie begegnen ihm bei direkten Zuweisungen, bei Eingaben, die in zu wenige Felder aufgeteilt werden, und bei Dictionary-Schleifen, die jedes Paar in eine falsche Anzahl von Namen entpacken. Diese Anleitung zeigt, wie Sie die Meldung lesen und jede Situation beheben.
Warum Python ValueError: not enough values to unpack auslöst
Beim Entpacken werden die Elemente eines Iterables – eines Tupels, einer Liste, eines Strings oder eines View-Objekts – einer passenden Liste von Namen zugewiesen. In a, b, c = 3, 5 zählt Python beide Seiten, bevor etwas zugewiesen wird: drei Namen links, zwei Werte rechts. Da weniger Werte ankommen, als Ziele angegeben wurden, löst der Interpreter einen ValueError aus, dessen Meldung beide Zahlen nennt: expected 3, got 2. Diese beiden Zahlen sind die Diagnose – die erste gibt an, wie viele Ziele Sie geschrieben haben, die zweite, wie viele Werte das Iterable tatsächlich geliefert hat.
Führen Sie dieses Beispiel aus, um die Meldung zu sehen, die Python ausgibt:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
try:
a, b, c = 3, 5
except ValueError as error:
print("ValueError:", error)
ValueError: not enough values to unpack (expected 3, got 2)
Ohne try/except stoppt das Programm an der Zeile mit der Zuweisung. Dasselbe Missverhältnis tritt bei jedem Iterable auf, das kürzer als die Liste der Ziele ist – a, b, d, e = [1, 2, 3] verlangt vier Namen aus einer Liste mit drei Elementen, und a, b, c = 2 verlangt drei Namen aus einer einzelnen Ganzzahl, die Python überhaupt nicht entpacken kann.
Entpackfehler bei Zuweisungen und Eingaben beheben
Die einfachste Lösung besteht darin, beide Seiten in Übereinstimmung zu bringen: Die Anzahl der Namen links muss der Anzahl der Werte entsprechen, die die rechte Seite liefern kann. Wenn die Werte von input() stammen, denken Sie daran, dass input() immer einen String zurückgibt; split() bestimmt also, wie viele Felder die Zuweisung tatsächlich erhält. Das folgende Programm fordert drei kommagetrennte Zahlen an und erhält drei, sodass das Entpacken funktioniert und die Multiplikation ausgeführt wird. Führen Sie dieses Beispiel aus:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
import sys
from io import StringIO
# Simulate typing "2,2,2" at the prompt.
sys.stdin = StringIO("2,2,2\n")
x, y, z = input("Enter three numbers to multiply: ").split(",")
product = int(x) * int(y) * int(z)
print("The product of x, y, and z is:", product)
Enter three numbers to multiply: The product of x, y, and z is: 8
Die sys.stdin-Zeile steht für einen Benutzer, der 2,2,2 eingibt; in einem realen Programm rufen Sie input() wie gewohnt auf, und die Person an der Tastatur bestimmt, wie viele Felder ankommen. Wenn jemand weniger Felder eingibt, als die Ziele benötigen, ist die aufgeteilte Liste zu kurz, und Python löst denselben ValueError aus:
import sys
from io import StringIO
# Simulate typing "1,2" at the prompt.
sys.stdin = StringIO("1,2\n")
try:
x, y, z = input("Enter values for x, y and z: ").split(",")
except ValueError as error:
print("ValueError:", error)
Enter values for x, y and z: ValueError: not enough values to unpack (expected 3, got 2)
Wenn die rechte Seite berechtigterweise in der Länge variieren kann, nimmt ein mit Stern versehenes Ziel den Überschuss auf: first, *rest = [1, 2, 3] bindet first an 1 und rest an [2, 3]. Ein Stern hilft nur, wenn zusätzliche Elemente das Problem sind – wenn zu wenige Werte ankommen, gleichen Sie die Anzahlen ab oder validieren Sie zuerst die Eingabe.
Das Entpacken von Dictionaries mit .items() korrigieren
Ein Dictionary speichert Schlüssel-Wert-Paare. Die Iteration über das Dictionary selbst liefert nur seine Schlüssel, während .items() eine Ansicht von (key, value)-Paaren zurückgibt, in der jedes Paar genau zwei Werte enthält. Sie können die drei Standardansichten sehen:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
student = {"name": "Zeeshan Afridi", "degree": "BSSE", "section": "A"}
print("Keys:", student.keys())
print("Values:", student.values())
print("Items:", student.items())
Keys: dict_keys(['name', 'degree', 'section'])
Values: dict_values(['Zeeshan Afridi', 'BSSE', 'A'])
Items: dict_items([('name', 'Zeeshan Afridi'), ('degree', 'BSSE'), ('section', 'A')])
Da jedes Element aus .items() ein Paar mit zwei Werten ist, schlägt ein Schleifenkopf mit drei Zielen bereits bei der ersten Iteration fehl – nicht die Methode, sondern das Paar, das die Werte liefert, legt die Anzahl fest:
student = {"name": "Zeeshan Afridi", "degree": "BSSE", "section": "A"}
try:
for k, v, l in student.items():
print(k, v, l)
except ValueError as error:
print("ValueError:", error)
ValueError: not enough values to unpack (expected 3, got 2)
Die Lösung besteht darin, jedes Paar in zwei Namen zu entpacken – einen für den Schlüssel und einen für den Wert:
student = {"name": "Zeeshan Afridi", "degree": "BSSE", "section": "A"}
for key, value in student.items():
print("Key:", key)
print("Value:", value)
Key: name
Value: Zeeshan Afridi
Key: degree
Value: BSSE
Key: section
Value: A
Wenn Sie nur die Schlüssel benötigen, iterieren Sie direkt über das Dictionary mit for key in student:; verwenden Sie .values(), wenn Sie nur die Werte benötigen. Achten Sie darauf, eine Schleife nur über die Schlüssel nicht zu entpacken – for k, v in student: versucht, jeden Schlüssel-String selbst zu entpacken, sodass Schlüssel mit mehreren Zeichen mit too many values to unpack fehlschlagen.
Eingaben validieren und Entpackfehler behandeln
Zwei Vorgehensweisen verhindern, dass Benutzer auf diesen Fehler stoßen. Zählen Sie zunächst die Felder vor dem Entpacken: split() liefert eine Liste, und len() zeigt, ob sie der Anzahl der Namen entspricht, die Sie zuweisen möchten. So können Sie die Daten mit einer klaren Aufforderung erneut anfordern:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
import sys
from io import StringIO
# Simulate typing "1,2" at the prompt.
sys.stdin = StringIO("1,2\n")
parts = input("Enter three numbers to multiply: ").split(",")
if len(parts) != 3:
print("Please enter exactly three numbers separated by commas.")
else:
x, y, z = (int(part) for part in parts)
print("The product of x, y, and z is:", x * y * z)
Enter three numbers to multiply: Please enter exactly three numbers separated by commas.
Zweitens umschließen Sie den Block zum Entpacken und Umwandeln mit try/except – die Python-Schlüsselwörter lauten try und except, nicht die in einigen anderen Sprachen verwendete Schreibweise try-catch. Da int() bei nicht numerischen Feldern ebenfalls einen ValueError auslöst, deckt eine einzige except-Klausel sowohl eine zu kurze Feldliste als auch Werte ab, die nicht umgewandelt werden können:
import sys
from io import StringIO
# Simulate typing "2,two,4" at the prompt.
sys.stdin = StringIO("2,two,4\n")
try:
x, y, z = input("Enter three numbers to multiply: ").split(",")
product = int(x) * int(y) * int(z)
print("The product of x, y, and z is:", product)
except ValueError as error:
print("Could not use that input:", error)
Enter three numbers to multiply: Could not use that input: invalid literal for int() with base 10: 'two'
Das Abfangen der Ausnahme ermöglicht dem Programm eine Wiederherstellung, korrigiert aber nicht die Daten. Bevorzugen Sie die Längenprüfung – zusammen mit allen numerischen oder Formatprüfungen, die Ihre Eingabe erfordert –, damit Sie dem Benutzer genau sagen können, was er eingeben soll, und behalten Sie try/except als Sicherheitsnetz um das eigentliche Entpacken.