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
Patricia ArquetteOriginal
2024-12-28 10:35:11107Durchsuche

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))

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?
}

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)

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)

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)
  • Sofortiger Aufruf:

    (lambda d=d: lambda: self.root.change_directory(d))()

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!

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