Heim >Backend-Entwicklung >Python-Tutorial >Warum binden Python-Lambdas an die Werte lokaler Variablen und nicht an Referenzen?
Python-Lambda-Funktionen und lokale Variablenbindung
Bei der Arbeit mit Python-Lambda-Funktionen ist es wichtig, deren Verhalten in Bezug auf Verweise auf darin enthaltene lokale Variablen zu verstehen der Umfang, in dem sie definiert sind. Der folgende Code veranschaulicht dieses Problem:
<code class="python">def pv(v): print(v) x = [] for v in range(2): x.append(lambda: pv(v)) for xx in x: xx()</code>
In diesem Szenario würden wir erwarten, dass 0 und 1 auf der Konsole gedruckt werden. Die tatsächliche Ausgabe gibt jedoch zweimal 1 aus. Dieses Verhalten ergibt sich aus der Art und Weise, wie Python-Lambdas an lokale Variablen binden.
Das Problem: Frühe Bindung
Python-Lambdas binden nicht an die Referenz lokaler Variablen, wenn sie sind entstanden. Stattdessen binden sie sich an den Wert der Variablen zu diesem bestimmten Zeitpunkt. Wenn das Lambda aufgerufen wird, greift es daher auf den aktuellen Wert der Variablen zu und nicht auf den Wert, der zum Zeitpunkt der Erstellung verfügbar war.
Eine Lösung: Späte Bindung mit Standardargumenten
Um eine lokale Variable an eine Lambda-Funktion zu binden und ihre korrekte Referenz beizubehalten, können wir die späte Bindung verwenden. Dies wird erreicht, indem ein Standardargument an die Lambda-Funktion übergeben wird, wie unten gezeigt:
<code class="python">x.append(lambda v=v: pv(v))</code>
Mit dieser Änderung wird das Lambda an den Wert von v gebunden, wenn das Lambda erstellt wird, nicht wenn es aufgerufen wird. Wenn wir also die Liste x durchlaufen und jede Lambda-Funktion aufrufen, erhalten wir die erwartete Ausgabe von 0 und 1.
Frühe Bindung verstehen
Weitere Informationen Um dieses Konzept zu verdeutlichen, betrachten Sie das folgende Beispiel:
<code class="python">x = "before foo defined" def foo(): print(x) x = "after foo was defined" foo()</code>
Dieser Codeausschnitt gibt „nachdem foo definiert wurde“ an die Konsole aus und zeigt, dass Variablen zum Zeitpunkt des Funktionsaufrufs und nicht zum Zeitpunkt der Erstellung gebunden sind.
Das obige ist der detaillierte Inhalt vonWarum binden Python-Lambdas an die Werte lokaler Variablen und nicht an Referenzen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!