Lambda-Funktionen in Schleifen
In Python bieten Lambda-Funktionen eine übersichtliche Möglichkeit, anonyme Funktionen zu definieren. Wenn sie jedoch innerhalb von Schleifen verwendet werden, können sie zu unerwartetem Verhalten führen, wenn keine ordnungsgemäße Bindung gewährleistet ist.
Beachten Sie den folgenden Codeausschnitt:
directorys = {'login': <object>, 'home': <object>} for d in directorys: self.command["cd " + d] = (lambda : self.root.change_directory(d))
Die Absicht besteht darin, einen Wörterbuchzuordnungsbefehl zu erstellen Zeichenfolgen an Funktionen, die das Verzeichnis ändern. Das Ergebnis ist jedoch unerwartet: Die beiden erstellten Lambda-Funktionen sind identisch und führen denselben Befehl aus, wodurch das Verzeichnis in „login“ geändert wird.
Warum passiert das?
Lambda-Funktionen innerhalb einer Schleife haben denselben Funktionsumfang. Dies bedeutet, dass die von der Lambda-Funktion erfasste Variable für alle Iterationen der Schleife dieselbe ist. In diesem Fall stellt „d“ den Wert des letzten Elements im „Verzeichnisse“-Wörterbuch dar, nämlich „login“.
Lösung des Problems
Um sicherzustellen Für eine ordnungsgemäße Bindung müssen wir sicherstellen, dass jede Lambda-Funktion Zugriff auf ihren eigenen eindeutigen Wert „d“ hat. Ein Ansatz besteht darin, „d“ als Parameter mit einem Standardwert zu übergeben:
lambda d=d: self.root.change_directory(d)
Indem wir den Standardwert von „d“ in jeder Iteration der Schleife auf den aktuellen Wert von „d“ setzen, können wir Erstellen Sie für jede Lambda-Funktion einen eindeutigen Abschluss. Alternativ können wir zusätzliche Abschlusstechniken verwenden, um das gleiche Ergebnis zu erzielen:
(lambda d=d: lambda: self.root.change_directory(d))()
Diese äußere Lambda-Funktion erstellt einen Abschluss für „d“ und die innere Lambda-Funktion verwendet „d“ aus dem Abschluss.
Das obige ist der detaillierte Inhalt vonWarum können Lambda-Funktionen in Python-Schleifen manchmal nicht richtig gebunden werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!