Heim > Backend-Entwicklung > Python-Tutorial > Warum zeigen Lambda-Funktionen in Schleifen in Python unerwartetes Verhalten?

Warum zeigen Lambda-Funktionen in Schleifen in Python unerwartetes Verhalten?

Patricia Arquette
Freigeben: 2024-12-28 10:35:11
Original
141 Leute haben es durchsucht

Why Do Lambda Functions in Loops in Python Exhibit Unexpected Behavior?

Lambda in einer Schleife: Standard-Abschlussparameter verstehen

In der Python-Programmierung sind Lambda-Funktionen anonyme Funktionen, die zum Erstellen dynamischen Codes verwendet werden können Blöcke. Bei der Verwendung von Lambdas in Schleifen kann es jedoch zu unerwartetem Verhalten kommen. Dieser Artikel untersucht das Problem und bietet Lösungen.

Bedenken 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

Das Ziel besteht darin, ein Wörterbuch self.command zu erstellen, das Befehle Funktionen zuordnet. Jede Funktion sollte das Verzeichnis auf den angegebenen Wert in Verzeichnissen ändern. Das Ergebnis ist jedoch unerwartet:

# Expected:
self.command == {
    "cd login": lambda: self.root.change_directory("login"),
    "cd home": lambda: self.root.change_directory("home")
}

# Result:
self.command == {
    "cd login": lambda: self.root.change_directory("login"),
    "cd home": lambda: self.root.change_directory("login")  # <- Why login?
}
Nach dem Login kopieren

Das Problem entsteht, weil in einer Schleife erstellte Lambda-Funktionen denselben Abschluss haben. Wenn d in der Schleife aktualisiert wird, wirkt sich dies auf alle Lambda-Funktionen aus und führt dazu, dass sie auf dieselbe Variable verweisen.

Lösung: Standard-Abschlussparameter verwenden

Um dieses Problem zu beheben , Standard-Abschlussparameter einführen. So geht's:

lambda d=d: self.root.change_directory(d)
Nach dem Login kopieren

Durch die Übergabe von d als Parameter mit einem Standardwert referenziert die Funktion innerhalb des Lambda ihren eigenen Parameter anstelle der Schleifenvariablen. Dadurch wird sichergestellt, dass jede Funktion das Verzeichnis auf den beabsichtigten Wert ändert.

# Another way to bind d:
lambda bound_d=d: self.root.change_directory(bound_d)
Nach dem Login kopieren

Bedenken Sie, dass Standardwerte für veränderbare Objekte (wie Listen und Diktate) gemeinsam genutzt werden. Seien Sie daher beim Binden dieser Typen vorsichtig.

Zusätzliche Schließungstechniken

Wenn die Übergabe von Standardparametern nicht ideal ist, probieren Sie diese alternativen Schließungen aus Techniken:

  • Verschachtelte Verschlüsse:

    (lambda d: lambda: self.root.change_directory(d))(d)
    Nach dem Login kopieren
  • Sofortiger Aufruf:

    (lambda d=d: lambda: self.root.change_directory(d))()
    Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWarum zeigen Lambda-Funktionen in Schleifen in Python unerwartetes Verhalten?. 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