Betrachten Sie den folgenden Codeausschnitt:
# directorys == {'login': <object at ...>, 'home': <object at ...>} for d in directorys: self.command["cd " + d] = (lambda : self.root.change_directory(d))
Ziel ist es, ein Wörterbuch mit zwei Funktionen mit Tasten zu erstellen. cd login“ und „cd home“. Das Ergebnis zeigt jedoch, dass beide Lambda-Funktionen mit der Taste „cd login“ den gleichen Inhalt haben.
Um dieses unerwartete Verhalten zu verstehen, ist es wichtig zu berücksichtigen, wie Lambda-Funktionen in verschachtelten Schleifen funktionieren. Wenn eine Lambda-Funktion innerhalb einer Schleife definiert wird, erfasst sie Variablen aus dem umgebenden Bereich. In diesem Fall wird die Variable d aus der Schleife von jeder Lambda-Funktion erfasst.
Lambda-Funktionen werden jedoch träge ausgeführt. Wenn Sie also außerhalb der Schleife auf das Wörterbuch self.command zugreifen, haben alle Lambda-Funktionen dieselbe d-Variable erfasst, die den letzten Wert von d in der Schleife darstellt. Daher verweisen alle Funktionen auf dieselbe Methode, was zu dem beobachteten Verhalten führt.
Um dieses Problem zu lösen, müssen wir sicherstellen, dass jede Lambda-Funktion einen eindeutigen Wert von d erfasst. Eine Lösung besteht darin, d als Parameter an die Lambda-Funktion zu übergeben und einen Standardwert bereitzustellen:
lambda d=d: self.root.change_directory(d)
Jetzt verwendet d in der Lambda-Funktion den Parameter, obwohl er denselben Namen hat. Der Standardwert für diesen Parameter wird ausgewertet, wenn die Funktion erstellt wird, wodurch er für jede Iteration der Schleife an den korrekten Wert von d gebunden wird.
Alternativ können wir verschachtelte Abschlüsse verwenden, um das gleiche Ergebnis zu erzielen:
(lambda d: lambda: self.root.change_directory(d))(d)
Das obige ist der detaillierte Inhalt vonWarum erfassen Lambda-Funktionen in Schleifen den letzten Wert und nicht den Wert jeder Iteration?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!