Heim > Backend-Entwicklung > Python-Tutorial > Warum binden Python-Lambdas an die Werte lokaler Variablen und nicht an Referenzen?

Warum binden Python-Lambdas an die Werte lokaler Variablen und nicht an Referenzen?

Linda Hamilton
Freigeben: 2024-10-28 06:37:02
Original
1121 Leute haben es durchsucht

 Why do Python Lambdas Bind to Local Variables' Values, Not References?

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage