Heim  >  Artikel  >  Backend-Entwicklung  >  Warum erfassen Lambda-Funktionen in Schleifen den endgültigen Indexwert anstelle des Schleifeniterationswerts?

Warum erfassen Lambda-Funktionen in Schleifen den endgültigen Indexwert anstelle des Schleifeniterationswerts?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-26 22:44:30925Durchsuche

Why Do Lambda Functions in Loops Capture the Final Index Value Instead of the Loop Iteration Value?

Schließung in Python-Lambda-Funktionen verstehen

Ursprüngliche Frage: Lambda-Schließungsrätsel mit Indexdruck

In der Programmierung bezieht sich ein Abschluss auf eine innere Funktion, die die Variablen ihrer umschließenden Funktion auch dann erfasst, wenn die umschließende Funktion zurückgekehrt ist. Dadurch kann die innere Funktion den Zugriff auf die Variablen behalten, sodass diese innerhalb der Lebensdauer des Abschlusses bestehen bleiben.

Ein häufiger Anwendungsfall für Lambda-Ausdrücke besteht darin, eine Variable an eine Funktion zu binden. Wenn Lambda-Funktionen jedoch wie im bereitgestellten Beispielcode innerhalb einer Schleife verwendet werden, können sie aufgrund des Schließens unerwartetes Verhalten zeigen.

Code-Erklärung

Im angegebenen Code Innerhalb einer Schleife werden fünf Schaltflächen erstellt. Jeder Schaltfläche ist eine Lambda-Funktion zugewiesen, die die Funktion makeId() aufruft und den Index i ausgibt. Wenn der Benutzer jedoch auf eine beliebige Schaltfläche klickt, gibt die Funktion makeId() immer 5 aus, was den Endwert von i in der Schleife darstellt.

Problem und Lösung

Dieses Problem entsteht, weil der Lambda-Ausdruck bei der Ausführung die Variable i auf ihren aktuellen Wert auflöst. Da die Schleife zu diesem Zeitpunkt bereits beendet ist, wird i auf seinen Endwert aufgelöst, der 5 ist.

Um dieses Problem zu beheben, muss der Lambda-Ausdruck geändert werden, um den korrekten Wert von i mithilfe eines Lambda-Parameters explizit anzugeben . Standardmäßig verwenden Lambdas die Variablen des umschließenden Bereichs, aber die Angabe eines Parameters stellt sicher, dass eine lokale Variable mit dem gewünschten Wert innerhalb des Lambda erstellt wird:

<code class="python">make_button = Tkinter.Button(frame, text="make!", command=lambda i=i: makeId(i))</code>

Mit dieser Änderung erfasst die Lambda-Funktion jeder Schaltfläche den richtigen Wert von i aus der Schleife, und die Funktion makeId() kann den beabsichtigten Index korrekt drucken.

Zusätzlicher Hinweis

Der Lambda-Parameter muss nicht dasselbe haben name als umschließende Variable. Es kann einen beliebigen Namen haben, um sicherzustellen, dass der richtige Wert im Lambda-Bereich erfasst wird.

Das obige ist der detaillierte Inhalt vonWarum erfassen Lambda-Funktionen in Schleifen den endgültigen Indexwert anstelle des Schleifeniterationswerts?. 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