Was erfassen Python-Lambda-Funktionsabschlüsse?
Bei der Arbeit mit Python-Lambda-Funktionsabschlüssen ist es wichtig, deren Erfassungsverhalten zu verstehen. Ein Abschluss erfasst die Werte von Variablen aus seinem umschließenden Bereich, die innerhalb des Abschlusses verwendet werden. Die Art und Weise, wie diese Erfassung erfolgt, kann jedoch überraschend sein.
Um dies zu veranschaulichen, betrachten Sie den folgenden Code:
adders = [None, None, None, None] for i in [0, 1, 2, 3]: adders[i] = lambda a: i + a print(adders[1](3))
In diesem Code erstellen wir eine Liste von Lambda-Funktionen, die ausgeführt werden einen einzelnen Eingang und fügen Sie ihm einen konstanten Wert hinzu. Der konstante Wert wird bei der Funktionserstellung zunächst auf den Wert von i gesetzt. Wenn wir jedoch die Liste der Abschlüsse untersuchen, stellen wir überraschenderweise fest, dass sie alle auf den Endwert von i verweisen, was zu einer unerwarteten Ausgabe von 6 führt.
Dieses Verhalten resultiert aus der Tatsache, dass Abschlüsse den Wert von erfassen Variable und nicht ihre Referenz. Wenn sich der Wert von i nach der Abschlusserstellung ändert, bezieht sich der Abschluss daher weiterhin auf den zuletzt erfassten Wert.
Erfassen des aktuellen Werts
Um den zu erfassen Um den aktuellen Wert von i zu ermitteln, können wir einen Trick anwenden, der als „Dummy-Parameter“-Technik bekannt ist. Indem wir einen Parameter mit demselben Namen wie die Variable, die wir erfassen möchten, deklarieren und ihn mit einem Standardwert dieser Variablen versehen, erzwingen wir, dass der Abschluss den aktuellen Wert erfasst.
for i in [0, 1, 2, 3]: adders[i] = lambda a, i=i: i + a # <-- Note the dummy parameter with a default value print(adders[1](3)) # Output: 4
Mit dieser Technik wird die Der Abschluss erfasst den Wert von i zum Zeitpunkt seiner Erstellung und stellt sicher, dass spätere Änderungen an i keinen Einfluss auf das Verhalten des Abschlusses haben.
Das obige ist der detaillierte Inhalt vonWelche Variablen erfassen Python-Lambda-Funktionsabschlüsse tatsächlich?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!