Heim >Backend-Entwicklung >Python-Tutorial >Warum können Lambda-Funktionen in Python-Schleifen manchmal nicht richtig gebunden werden?

Warum können Lambda-Funktionen in Python-Schleifen manchmal nicht richtig gebunden werden?

Barbara Streisand
Barbara StreisandOriginal
2024-12-26 19:43:22487Durchsuche

Why Do Lambda Functions in Python Loops Sometimes Fail to Bind Properly?

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!

Stellungnahme:
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