Beim Erstellen von Funktionen oder Lambdas innerhalb einer Schleife ist es wichtig, das Konzept zu berücksichtigen der späten Bindung. Im gegebenen Beispiel:
functions = [] for i in range(3): def f(): return i functions.append(f)
jede Funktion sucht den Wert von i so spät wie möglich, also nach Abschluss der Schleife. Infolgedessen geben alle Funktionen den Endwert von i zurück, der 2 ist.
Um dieses Problem zu beheben und drei verschiedene Funktionen zu erhalten, die 0, 1 und 2 ausgeben, müssen wir eine frühe Bindung erzwingen. Dies kann durch die Verwendung von Standardparametern erreicht werden:
functions = [] for i in range(3): def f(i=i): # Default parameter for i return i functions.append(f)
In diesem Fall wird der Standardparameter i zum Zeitpunkt der Definition und nicht zum Zeitpunkt des Aufrufs ausgewertet, um sicherzustellen, dass jede Funktion den korrekten Wert von i verwendet.
Alternativ können wir eine Funktionsfabrik verwenden, um Funktionen mit früher Bindung zu erstellen:
def make_f(i): def f(): return i return f functions = [] for i in range(3): functions.append(make_f(i))
Die Funktion make_f erstellt eine neue Funktion mit dem korrekten Wert von i gebunden früh.
Das obige ist der detaillierte Inhalt vonWarum geben in einer Schleife erstellte Funktionen denselben Wert zurück und wie kann ich das beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!