Heim >Backend-Entwicklung >Python-Tutorial >Warum gibt der Befehl meiner Schaltfläche in einer Schleife mit einem Lambda immer denselben Index aus?
Schließung in einem Lambda verstehen: Variablen auflösen
In dieser Situation versuchen Sie, jeweils mehrere Schaltflächen innerhalb einer Schleife zu erstellen Schaltfläche, die einen Befehl auslöst, der einen bestimmten Indexwert druckt. Sie stoßen jedoch auf ein Problem, bei dem der Befehl der Schaltfläche immer denselben Index ausgibt, „5“.
Dieses Verhalten ist auf die Natur von Abschlüssen in Lambdas zurückzuführen. Wenn ein Lambda definiert ist, erfasst es die Variablen des umschließenden Bereichs und referenziert sie bei der Ausführung. In Ihrem Fall ist der umschließende Bereich die Schleife, in der die Variable i den aktuellen Index darstellt.
Leider hat der Wert von i bei der Ausführung des Lambda (wenn die Schaltfläche gedrückt wird) bereits den letzten erreicht Iteration und ist für alle Schaltflächen gleich „5“. Dies liegt daran, dass die erfasste Variable i eine Referenz auf denselben Speicherort ist und der Wert, den sie enthält, im Verlauf der Schleife aktualisiert wird.
Um dieses Problem zu beheben, müssen Sie einen Abschluss erstellen, der den richtigen Wert erfasst von i für jede Taste. Sie können dies tun, indem Sie einen Standardwert für den i-Parameter in der Lambda-Funktion angeben. Beispiel:
<code class="python">make_button = Tkinter.Button(frame, text="make!", command=lambda i=i: makeId(i))</code>
Indem Sie i=i als Standardwert für den Lambda-Parameter angeben, erstellen Sie eine lokale Variable i, die den richtigen Indexwert für jede Schaltfläche enthält. Wenn die Schaltfläche gedrückt wird, wird die Lambda-Funktion mit der erfassten lokalen Variablen i ausgeführt und der richtige Index wird gedruckt.
Das obige ist der detaillierte Inhalt vonWarum gibt der Befehl meiner Schaltfläche in einer Schleife mit einem Lambda immer denselben Index aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!