Heim >Backend-Entwicklung >Python-Tutorial >Warum erfassen Lambdas in For-Schleifen nur den letzten Wert?
Lambda in der For-Schleife erfasst nur den letzten Wert
Bei der Verwendung einer Lambda-Funktion innerhalb einer for-Schleife ist es wichtig, ihr Verhalten in Bezug auf die lokale Schleife zu verstehen Variablenerfassung. Standardmäßig erfasst ein Lambda die Werte lokaler Variablen zum Zeitpunkt der Lambda-Definition. Wenn sich diese Variablen jedoch innerhalb der Schleife ändern, erfasst das Lambda immer den endgültigen Wert, den sie annehmen.
Codebeispiel:
Bedenken Sie den folgenden Code:
options = ["INFO", "WARNING", "DEBUG"] for i in range(len(options)): option = options[i] __cMenu.add_command( label="{}".format(option), command=lambda: self.filter_records(column, option) )
Dieser Code zielt darauf ab, mehrere Lambdas zu erstellen, von denen jedes einen anderen Wert der Optionsvariablen erfasst. Wenn diese Lambdas jedoch ausgeführt werden, verhalten sie sich alle so, als ob die Option auf „DEBUG“ gesetzt wäre, den letzten Wert, den sie in der Schleife annimmt.
Grund:
Dieses Verhalten tritt auf, weil die Namen in den Funktionskörpern von Lambdas ausgewertet werden, wenn die Funktion ausgeführt wird. Daher wird im bereitgestellten Code die Optionsvariable ausgewertet, wenn jedes Lambda aufgerufen wird, was zur Erfassung nur des Endwerts der Option führt.
Lösung:
Um dieses Problem zu vermeiden, muss der Wert der Option zum Zeitpunkt der Lambda-Definition erfasst werden. Dies kann erreicht werden, indem die Option einer neuen Variablen innerhalb des Lambda zugewiesen wird, wie im geänderten Code unten zu sehen ist:
options = ["INFO", "WARNING", "DEBUG"] for i in range(len(options)): option = options[i] __cMenu.add_command( label="{}".format(option), command=lambda opt=option: self.filter_records(column, opt) )
Durch die Verwendung des opt-Parameters innerhalb des Lambda wird der Wert der Option zu diesem Zeitpunkt erfasst Das Lambda wird erstellt, um sicherzustellen, dass jedes Lambda mit dem richtigen Wert arbeitet.
Das obige ist der detaillierte Inhalt vonWarum erfassen Lambdas in For-Schleifen nur den letzten Wert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!