Heim  >  Artikel  >  Backend-Entwicklung  >  Wie vermeide ich das Schließen von Variablen beim Erstellen von Lambdas innerhalb von Schleifen?

Wie vermeide ich das Schließen von Variablen beim Erstellen von Lambdas innerhalb von Schleifen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-16 14:31:03558Durchsuche

How to Avoid Variable Closure When Creating Lambdas Inside Loops?

Erstellen von Lambdas innerhalb einer Schleife ohne Variablenabschluss

Beim Erstellen von Lambdas innerhalb einer Schleife, die über eine Liste von Objekten iteriert, ist es wichtig, dies zu tun verhindern variable Schließung. Eine Variablenschließung erfolgt, wenn eine Funktion den Zugriff auf eine Variable außerhalb ihres unmittelbaren Gültigkeitsbereichs behält. Dies kann zu unerwartetem Verhalten führen, beispielsweise wenn alle Lambdas auf denselben Endwert einer Variablen verweisen.

Das Problem:

Der folgende Code veranschaulicht das Problem:

lambdas_list = []
for obj in obj_list:
    lambdas_list.append(lambda: obj.some_var)

for f in lambdas_list:
    print(f())

Beim Aufrufen der Lambdas in diesem Code erzeugen alle Lambdas das gleiche Ergebnis: den Wert von obj.some_var aus dem letzten Objekt in obj_list. Dies liegt daran, dass sich die Lambdas alle auf dieselbe obj-Variable beziehen, die sich mit jeder Iteration der Schleife ändert.

Die Lösung:

Um das Schließen von Variablen zu verhindern, können wir Folgendes tun Verwenden Sie die Syntax Lambda x=x: wobei x die Variable ist, die wir erfassen möchten. Dies erfasst eine Kopie von obj und macht sie lokal für jedes Lambda:

lambdas_list = []
for obj in obj_list:
    lambdas_list.append(lambda obj=obj: obj.some_var)

for f in lambdas_list:
    print(f())

Jetzt verweist jedes Lambda auf das richtige obj und erzeugt den erwarteten Wert für obj.some_var.

Das obige ist der detaillierte Inhalt vonWie vermeide ich das Schließen von Variablen beim Erstellen von Lambdas innerhalb von Schleifen?. 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