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!