Lambda-Funktionsverhalten in der Schleife
Im angegebenen Codeausschnitt wird ein Wörterbuch mit Lambda-Funktionen gefüllt. Jede Funktion ist dafür verantwortlich, das aktuelle Verzeichnis in ein Verzeichnis zu ändern. Wenn die Schleife jedoch abgeschlossen ist, verweisen alle Lambda-Funktionen auf denselben Verzeichnisnamen.
Um zu verstehen, warum dies geschieht, ist es wichtig, die Natur von Lambda-Funktionen in Schleifen zu erkennen. Lambda-Funktionen sind Abschlüsse, das heißt, sie erfassen die Werte ihres umschließenden Bereichs. In diesem Fall wird die Lambda-Funktion innerhalb der Schleife definiert und erfasst den Wert der d-Variablen.
Die d-Variable wird jedoch in der gesamten Schleife wiederverwendet und überschreibt kontinuierlich ihren Wert. Infolgedessen erfassen alle Lambda-Funktionen am Ende den gleichen Endwert von d.
Lösung
Um dieses Problem zu beheben, ist es notwendig, jede Lambda-Funktion an zu binden ein spezifischer Wert von d. Dies kann durch die Verwendung eines Standardparameterwerts erreicht werden:
lambda d=d: self.root.change_directory(d)
In diesem Code akzeptiert die Lambda-Funktion einen optionalen Parameter d mit einem Standardwert des aktuellen Werts von d in der Schleife. Da Standardparameterwerte beim Erstellen der Funktion ausgewertet werden, erfasst jede Lambda-Funktion ihren eigenen eindeutigen Wert von d.
Alternativ kann ein zusätzlicher Abschluss verwendet werden, um das gleiche Ergebnis zu erzielen:
(lambda d: lambda: self.root.change_directory(d))(d)
In diesem Fall wird eine äußere Lambda-Funktion verwendet, um einen Abschluss um die d-Variable zu erstellen. Anschließend wird die innere Lambda-Funktion verwendet, um den Verzeichniswechsel durchzuführen.
Durch die Verwendung dieser Techniken kann sichergestellt werden, dass jede Lambda-Funktion in der Schleife ihre eigene eindeutige Bindung an die d-Variable hat, was zum gewünschten Ergebnis führt Verhalten.
Das obige ist der detaillierte Inhalt vonWarum beziehen sich Lambda-Funktionen in einer Schleife alle auf dieselbe Variable?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!