Heim  >  Artikel  >  Backend-Entwicklung  >  Warum drucken alle meine Schaltflächen denselben Index, wenn ich ein Lambda in einer Schleife verwende?

Warum drucken alle meine Schaltflächen denselben Index, wenn ich ein Lambda in einer Schleife verwende?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-26 00:44:28575Durchsuche

Why do all my buttons print the same index when using a lambda in a loop?

Schließung in Lambdas verstehen

Ein häufiges Problem tritt auf, wenn versucht wird, einen Befehl mithilfe eines Lambda innerhalb einer Schleife an eine Schaltfläche zu binden. Anstatt den erwarteten Index zu drucken, wird stets der Endwert der Schleifenvariablen gedruckt. Dies geschieht aufgrund des Variablenauflösungsmechanismus des Abschlusses.

Im bereitgestellten Beispiel:

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

Wenn das Lambda ausgeführt wird, löst es die Variable i auf ihren Wert zu diesem Zeitpunkt auf. Da die Schleife bis dahin beendet ist, habe ich auf 5 erhöht, wodurch alle Schaltflächen denselben Index ausgeben.

Um dies zu beheben, kann eine lokale Variable innerhalb des Lambda mit der Syntax command= lambda i= erstellt werden ich:. Dadurch wird der aktuelle Wert von i einer lokalen Variablen zugewiesen, die vom Lambda-Abschluss erfasst wird.

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

Jetzt wird das Lambda mit dem richtigen Indexwert für jede Schaltfläche ausgeführt. Beachten Sie, dass der lokalen Variablen ein beliebiger Name zugewiesen werden kann, um sicherzustellen, dass sie sich von der Schleifenvariablen unterscheidet.

Das obige ist der detaillierte Inhalt vonWarum drucken alle meine Schaltflächen denselben Index, wenn ich ein Lambda in einer Schleife verwende?. 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