HOWTO · Python
IndexError: Tupelindex außerhalb des Bereichs in Python
Wir werden demonstrieren, wie der Tupelindex außerhalb des gültigen Bereichs in Python behoben wird.
Auf dieser Seite
Ein Tupelindexfehler bedeutet, dass Python ein Element an einer Position abrufen soll, die im Tupel nicht vorhanden ist. Dieser Leitfaden erklärt, wie Indizes funktionieren, wie Sie das letzte Element auswählen und wie Sie mit einem Index umgehen, der von sich ändernden Daten abhängt.
Was IndexError: tuple index out of range bedeutet
Ein Tupel ist eine geordnete, unveränderliche Sammlung. Python nummeriert seine Elemente ab 0. Ein Tupel mit n Elementen hat daher gültige positive Indizes von 0 bis n - 1. Das letzte Element eines Tupels mit sieben Elementen befindet sich beispielsweise an Index 6, nicht an Index 7. Beim Versuch, auf Index 7 zuzugreifen, wird IndexError: tuple index out of range ausgelöst.
Negative Indizes zählen vom Ende rückwärts: Mit -1 wählen Sie das letzte Element aus, mit -2 das davor. Ein leeres Tupel enthält keine Elemente. Daher lässt sich daraus weder mit einem positiven noch mit einem negativen Index ein Element auswählen.
Häufige Ursachen des Fehlers
Am häufigsten ist eine Berechnung um eins daneben, oft weil die Länge des Tupels als Index verwendet wird. Hat items vier Elemente, ist len(items) gleich 4, der letzte gültige positive Index aber 3. Eine Schleife mit range(len(items)) ist bei gewöhnlichen Indexzugriffen sicher, weil ihr letzter Wert um eins kleiner als die Länge ist. Wenn Sie manuell eins addieren, kann der Index zu groß werden.
Der Index kann auch aus einer Eingabe, einer Berechnung oder aus Daten stammen, die sich zwischen einzelnen Schritten ändern. Prüfen Sie den Wert, der beim fehlerhaften Zugriff tatsächlich verwendet wird, und die aktuelle Länge des Tupels. Ein anderer Werttyp erklärt diese tupelspezifische Meldung nicht von selbst. Wenn der Traceback oder der Variablenname irreführend ist, prüfen Sie, auf welches Objekt zugegriffen wird.
Sicher auf das letzte Tupel-Element zugreifen
Für ein Tupel mit mindestens einem Element ist items[-1] die kürzeste Möglichkeit, das letzte Element abzurufen. Wenn Sie die Länge bereits für eine andere Berechnung benötigen, wählt items[len(items) - 1] dieselbe Position aus. Beide Varianten setzen voraus, dass das Tupel mindestens ein Element enthält.
Führen Sie dieses Beispiel aus:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
items = ("red", "green", "blue")
print(items[-1])
Die Ausgabe ist blue.
blue
Wenn das Tupel leer sein kann, prüfen Sie es vor dem Zugriff:
items = ()
if items:
print(items[-1])
else:
print("No items")
Die Ausgabe ist No items.
No items
So wird der Fall ohne Elemente ausdrücklich behandelt, statt einen Zugriff zu versuchen, der nicht funktionieren kann.
Indizes behandeln, die außerhalb des gültigen Bereichs liegen können
Wenn ein Index innerhalb des Tupels liegen sollte, prüfen Sie ihn vor dem Zugriff. So können Sie auch einfach einen Standardwert auswählen oder melden, dass die angeforderte Position nicht verfügbar ist:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
items = ("red", "green", "blue")
index = 4
if 0 <= index < len(items):
print(items[index])
else:
print("Index is outside the tuple")
Die Ausgabe ist Index is outside the tuple.
Index is outside the tuple
Eine Bereichsprüfung ist hilfreich, wenn das Programm auf eine nicht verfügbare Position auf bestimmte Weise reagieren soll. Fangen Sie IndexError ab, wenn der Index bei einem Vorgang berechtigterweise variieren kann und die Behandlung des Fehlers klarer ist als eine vorherige Prüfung. Beschränken Sie den try-Block auf diesen Zugriff; eine zu weit gefasste Ausnahmebehandlung kann andere Programmierfehler verbergen. Bei einem leeren Tupel gibt es keinen Index, der die Prüfung auf einen gültigen positiven Index besteht.
Wert und Index vor dem Zugriff prüfen
Wenn der Typ des Objekts unklar ist, prüfen Sie zunächst mit isinstance(value, tuple), ob es ein Tupel ist. Damit prüfen Sie den Typ des Objekts, nicht aber, ob ein bestimmter Index vorhanden ist. Prüfen Sie anschließend den Index anhand von len(value) oder behandeln Sie IndexError direkt beim Zugriff. Wenn es sich um einen anderen Sequenztyp handelt, untersuchen Sie dessen erwartetes Verhalten, statt anzunehmen, dass er die tupelspezifische Meldung verursacht hat.
Kurz gesagt: IndexError weist auf einen versuchten Zugriff über die verfügbaren Positionen eines Tupels hinaus hin. Korrigieren Sie Berechnungen, die um eins danebenliegen, verwenden Sie items[-1] für das letzte Element eines nicht leeren Tupels und wählen Sie bei datenabhängigen Indizes eine ausdrückliche Bereichsprüfung oder eine gezielte Ausnahmebehandlung.