Heim  >  Artikel  >  Backend-Entwicklung  >  Wie erfassen Sie lokale Variablen in Lambda-Abschlüssen innerhalb von Schleifen?

Wie erfassen Sie lokale Variablen in Lambda-Abschlüssen innerhalb von Schleifen?

DDD
DDDOriginal
2024-11-10 12:52:03259Durchsuche

How do you capture local variables in lambda closures within loops?

Lambda-Abschlüsse und Variablenbereiche in Schleifen

Beim Definieren von Lambdas innerhalb von Schleifen ist es wichtig zu verstehen, wie Variablenbereiche funktionieren. Im bereitgestellten Codeausschnitt verweist jedes innerhalb der Schleife erstellte Lambda auf dieselbe Variable obj, die bei jeder Iteration geändert wird.

Standardbereichsauflösung

Standardmäßig a Lambda erfasst die Variablen aus dem umschließenden Bereich. Im angegebenen Code ist der umschließende Bereich der Schleifenblock. Somit erfasst jedes Lambda effektiv den letzten Wert von obj. Dieses Verhalten kann zu falschen Ergebnissen führen, wenn die Lambdas aus einem anderen Bereich aufgerufen werden, da sie möglicherweise nicht den erwarteten Wert haben.

Lokale Variablen erfassen

Um dieses Problem zu beheben , müssen Sie das Lambda zwingen, den aktuellen Wert von obj zu erfassen. Dies kann durch die Einführung einer neuen lokalen Variablen im Lambda erreicht werden, die zum Zeitpunkt der Erstellung an obj gebunden ist. Der folgende Codeausschnitt demonstriert diesen Ansatz:

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

Indem wir obj explizit als Argument an das Lambda übergeben, erstellen wir für jedes Lambda eine neue lokale Variable. Dadurch wird sichergestellt, dass jedes Lambda den lokalen Wert von obj aus der Schleifeniteration erfasst. Wenn Sie die Lambdas aus einem anderen Bereich aufrufen, greifen sie daher auf den richtigen Wert zu.

Das obige ist der detaillierte Inhalt vonWie erfassen Sie lokale Variablen in Lambda-Abschlüssen 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