Heim >Backend-Entwicklung >Python-Tutorial >Warum geben in einer Python-Schleife erstellte Funktionen alle denselben Wert zurück?
Funktions- und Lambda-Erstellungsanomalien in Schleifen
Beim Versuch, Funktionen innerhalb einer Schleife zu generieren, wie im Codeausschnitt unten zu sehen ist, tritt eine Besonderheit auf Problem tritt auf:
functions = [] for i in range(3): def f(): return i functions.append(f)
Ähnlich bei der Verwendung Lambdas:
functions = [] for i in range(3): functions.append(lambda: i)
Man würde erwarten, dass diese Funktionen unterschiedliche Werte ausgeben (0, 1 und 2), aber am Ende liefern alle Funktionen denselben Wert (2).
Erklärung und Lösung
Dieses Phänomen wird durch eine späte Variablenbindung verursacht. In Python-Funktionen werden Variablen beim Aufruf aufgelöst, was bedeutet, dass beim Aufruf der Funktionen nach der Schleife der Wert von i bereits auf 2 gesetzt ist. Um dies zu beheben, verwenden wir eine frühe Bindung durch Einführung der f(i=i)-Syntax . Hier wird der Standardwert für das i-Argument zum Zeitpunkt der Definition festgelegt, was zu einer frühen Bindung führt:
def f(i=i): return i
Alternativ sorgt ein komplexerer Ansatz mit einem Abschluss und einer „Funktionsfabrik“ für eine frühe Bindung als Nun:
def make_f(i): def f(): return i return f
Innerhalb der Schleife können wir dann f = make_f(i) anstelle der def-Anweisung verwenden.
Das obige ist der detaillierte Inhalt vonWarum geben in einer Python-Schleife erstellte Funktionen alle denselben Wert zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!