Heim >Backend-Entwicklung >Python-Tutorial >Warum beziehen sich meine Lambda-Funktionen in einer Schleife alle auf dieselbe Variable?

Warum beziehen sich meine Lambda-Funktionen in einer Schleife alle auf dieselbe Variable?

Barbara Streisand
Barbara StreisandOriginal
2024-12-29 03:45:10966Durchsuche

Why Do My Lambda Functions in a Loop All Refer to the Same Variable?

Lambda in einer Schleife

Im bereitgestellten Code soll ein Wörterbuch mit Befehlsfunktionen erstellt werden, in dem jeder Wert ein Lambda-Ausdruck ist das self.root.change_directory mit einem bestimmten Verzeichnisnamen aufruft. Der Code führt jedoch fälschlicherweise dazu, dass alle Befehlsfunktionen denselben Verzeichniswechsel durchführen.

Das Problem entsteht, weil die Lambda-Ausdrücke auf eine einzelne Variable, d, verweisen, die für jede Iteration der Schleife dieselbe ist. Folglich verweisen alle Lambda-Ausdrücke letztendlich auf den letzten Wert von d.

Um dies zu korrigieren, ist es notwendig, an jeden Lambda-Ausdruck einen eindeutigen Wert von d zu binden. Dies kann erreicht werden, indem ein Standardwert für den Lambda-Parameter verwendet wird, wie unten gezeigt:

self.command["cd " + d] = lambda d=d: self.root.change_directory(d)

In diesem Fall erstellt d=d für jede Iteration von eine neue Bindung von d an den aktuellen Wert von d die Schleife. Dadurch hat jeder Lambda-Ausdruck seinen eigenen eindeutigen Verweis auf den d-Wert.

Alternativ kann ein Abschluss verwendet werden, um den gleichen Effekt zu erzielen:

self.command["cd " + d] = (lambda d: lambda: self.root.change_directory(d))(d)

Dieser Abschluss erstellt einen neuen Umgebung für jeden Lambda-Ausdruck, wobei d an den aktuellen Wert von d gebunden ist. Daher hat jeder Lambda-Ausdruck Zugriff auf seinen eigenen eindeutigen Wert von d.

Das obige ist der detaillierte Inhalt vonWarum beziehen sich meine Lambda-Funktionen in einer Schleife alle auf dieselbe Variable?. 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