HOWTO · Python

Beheben Sie den SyntaxError: 'break' Outside Loop Error in Python

In diesem Tutorial wird der Break-Outside-Loop-Fehler in Python behandelt.

Auf dieser Seite

Ein SyntaxError: 'break' outside loop bedeutet, dass Python eine break-Anweisung gefunden hat, für die keine umschließende for- oder while-Schleife zuständig ist. Verschiebe die Anweisung in die Schleife, die sie beenden soll. Eine if-Anweisung kann festlegen, wann die Schleife beendet werden soll, erzeugt aber selbst keine Schleife.

Was SyntaxError: 'break' outside loop bedeutet

Python prüft beim Parsen einer Datei, an welcher Stelle break vorkommt. In diesem Beispiel steht break innerhalb einer if-Anweisung, aber außerhalb jeder Schleife. Durch das Kompilieren des Quelltexts wird der Syntaxfehler erkannt, sodass das Beispiel selbst ausgeführt werden kann:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

source = """if ready:
    break"""
try:
    compile(source, "<example>", "exec")
except SyntaxError as error:
    print(f"{type(error).__name__}: {error.msg}")
SyntaxError: 'break' outside loop

Python weist den dargestellten Quelltext zurück, bevor das Programm startet. Dasselbe gilt innerhalb einer Funktion, wenn keine Schleife die Anweisung umschließt. Die Diagnose beschreibt eine falsche Platzierung und keinen Wert, der sich während der Programmausführung geändert hat.

Bei verschachteltem Code ist der Fehler leicht zu übersehen: Durch die Einrückung kann eine break einer Schleife zugeordnet wirken, obwohl sie tatsächlich außerhalb dieser Schleife steht. Prüfe die tatsächliche Einrückung und den umgebenden for- oder while-Block. Eine break innerhalb einer Hilfsfunktion kann keine Schleife in der aufrufenden Funktion beenden; jeder Funktionskörper wird für sich geparst.

Warum break innerhalb einer Schleife stehen muss

break beendet sofort die innerste umschließende Schleife. Python erlaubt die Anweisung in einer for- oder while-Schleife, auch innerhalb einer darin verschachtelten if-Anweisung. Eine if-Anweisung wählt lediglich aus, welche Anweisungen ausgeführt werden. Sie wiederholt keine Anweisungen und bietet daher keine Schleife, die break beenden könnte.

So ist beispielsweise if count == 3: break für sich allein nicht gültig. Platziere diese Bedingung innerhalb der Schleife, deren Durchlauf beendet werden soll. Bei verschachtelten Schleifen beendet break nur die nächstgelegene; die Ausführung wird danach fortgesetzt und befindet sich weiterhin in einer äußeren Schleife. Dieser Unterschied ist wichtig, wenn du die Anweisung richtig einrücken willst.

Fehler beheben, indem break in die Schleife verschoben wird

Führe dieses Beispiel aus:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

for number in range(5):
    if number == 3:
        break
    print(number)
0
1
2

Die Bedingung und break stehen beide innerhalb des for-Blocks. Daher gibt es für die Anweisung eine Schleife, die sie beenden kann. In deinem eigenen Code verschiebst du die Bedingung und die Abbruchanweisung gemeinsam in den Schleifenkörper, zu dem die betreffende Arbeit gehört. Ändere die Einrückung nicht nach Gefühl: Vergleiche die Anweisung mit dem Schleifenkopf und den anderen Anweisungen, die wiederholt werden sollen. Die unveränderte Ausgabe zeigt die Zahlen 0, 1 und 2.

Falls der Syntaxfehler bestehen bleibt, prüfe die gesamte umschließende Funktion und Schleife, nicht nur die wenigen Zeilen um break. Der else-Zweig einer Schleife wird ausgeführt, nachdem der Schleifenkörper ohne break beendet wurde. Er liegt außerhalb des Schleifenkörpers, daher gehört break nicht dorthin. Auch ein else-Zweig zu einer if-Anweisung erzeugt keine Schleife. Prüfe, ob ein Codeabschnitt beim Verschieben in eine separate Funktion aus der Schleife herauskopiert wurde.

Ein Flag verwenden oder die Schleife umstrukturieren, wenn das für mehr Klarheit sorgt

Manchmal fällt die Entscheidung über den nächsten Durchlauf vor jeder Iteration oder ergibt sich aus mehreren Stellen innerhalb der Schleife. In diesem Fall kann ein Flag Teil der Schleifenbedingung sein und break vollständig vermeiden:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

keep_going = True
number = 0
while keep_going and number < 5:
    if number == 3:
        keep_going = False
    else:
        print(number)
    number += 1
0
1
2

Das Flag steuert, ob ein weiterer Durchlauf beginnt; der else-Zweig verhindert, dass der Abbruchwert ausgegeben wird. Ein Flag ist nützlich, wenn es einen Zustand bezeichnet, den auch anderer Code benötigt. Bei einer einzelnen, klaren Abbruchbedingung innerhalb einer Schleife ist break meist einfacher und direkter.

Eine weitere Möglichkeit besteht darin, die Schleife so umzustrukturieren, dass ihre Bedingung angibt, wann die Arbeit fortgesetzt werden soll. Eine while-Schleife kann zum Beispiel am Schleifenkopf ein Suchergebnis oder eine Zustandsvariable prüfen. Eine for-Schleife kann eine begrenzte Folge verarbeiten, ohne dass eine separate Abbruchanweisung nötig ist. Wähle die Struktur, bei der die Abbruchregel am leichtesten zu erkennen ist. Füge nicht allein deshalb ein Flag hinzu, um ein korrekt platziertes break zu vermeiden; zusätzlicher Zustand kann den Kontrollfluss schwerer nachvollziehbar machen.

Kurz gesagt: Platziere break innerhalb der Schleife, die es beenden soll. Verwende ein Flag, wenn der Fortsetzungszustand über einen einzelnen Zweig hinaus Bedeutung hat, oder strukturiere die Schleife um, wenn ihre Bedingung die Aufgabe klarer ausdrücken kann.