Heim > Backend-Entwicklung > Python-Tutorial > Warum erfassen Lambda-Funktionen in Schleifen den letzten Wert und nicht den Wert jeder Iteration?

Warum erfassen Lambda-Funktionen in Schleifen den letzten Wert und nicht den Wert jeder Iteration?

Susan Sarandon
Freigeben: 2024-12-21 07:52:10
Original
422 Leute haben es durchsucht

Why Do Lambda Functions in Loops Capture the Last Value Instead of Each Iteration's Value?

Lambda in einer Schleife

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))
Nach dem Login kopieren

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)
Nach dem Login kopieren

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)
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage