Heim  >  Artikel  >  Backend-Entwicklung  >  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
Linda HamiltonOriginal
2024-10-28 06:37:02975Durchsuche

 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>

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!

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
Vorheriger Artikel:cs Woche ythonNächster Artikel:cs Woche ython