Verhindern von Lambda-Schließungsverwechslungen in Schleifen
Beim Erstellen von Lambdas innerhalb einer Schleife, die eine Liste von Objekten durchläuft, ist es wichtig, sich dessen bewusst zu sein Lambda-Schließverhalten. Standardmäßig erfassen Lambdas die Variablen im umschließenden Bereich, wenn sie definiert werden. Wenn sich jedoch Variablen innerhalb der Schleife ändern, verweisen später in der Schleife erstellte Lambdas auf die aktualisierten Werte.
Betrachten Sie das folgende Beispiel, in dem wir Lambdas erstellen, um auf das some_var-Attribut eines Objekts zuzugreifen:
lambdas_list = [] for obj in obj_list: lambdas_list.append(lambda: obj.some_var)
Wenn wir dann die Lambda-Liste durchlaufen und jedes Lambda aufrufen, erhalten wir möglicherweise für alle Lambdas den gleichen Wert. Dies liegt daran, dass das letzte in der Schleife erstellte Lambda den Endzustand von obj erfasst und dieser Wert von allen Lambdas zurückgegeben wird.
Um dieses Problem zu lösen, können wir das Objekt angeben, das vom Lambda erfasst werden soll ein Standardargument. Dadurch wird sichergestellt, dass jedes Lambda die richtige Objektreferenz erfasst:
lambdas_list.append(lambda obj=obj: obj.some_var)
Mit diesem Ansatz erfasst jedes Lambda das Objekt, auf das es bei seiner Erstellung verweisen sollte. Dies verhindert Verwirrung und stellt sicher, dass sich die Lambdas wie erwartet verhalten, wenn sie später in der Schleife aufgerufen werden.
Das obige ist der detaillierte Inhalt vonWie verhindern Sie Verwirrung beim Lambda-Schließen beim Erstellen von Lambdas in Schleifen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!