Heim >Backend-Entwicklung >Python-Tutorial >Warum geben in einer Python-Schleife erstellte Funktionen alle denselben Wert zurück?

Warum geben in einer Python-Schleife erstellte Funktionen alle denselben Wert zurück?

DDD
DDDOriginal
2024-12-22 01:57:14658Durchsuche

Why Do Functions Created in a Python Loop All Return the Same Value?

Funktions- und Lambda-Erstellungsanomalien in Schleifen

Beim Versuch, Funktionen innerhalb einer Schleife zu generieren, wie im Codeausschnitt unten zu sehen ist, tritt eine Besonderheit auf Problem tritt auf:

functions = []

for i in range(3):
    def f():
        return i
    functions.append(f)

Ähnlich bei der Verwendung Lambdas:

functions = []

for i in range(3):
    functions.append(lambda: i)

Man würde erwarten, dass diese Funktionen unterschiedliche Werte ausgeben (0, 1 und 2), aber am Ende liefern alle Funktionen denselben Wert (2).

Erklärung und Lösung

Dieses Phänomen wird durch eine späte Variablenbindung verursacht. In Python-Funktionen werden Variablen beim Aufruf aufgelöst, was bedeutet, dass beim Aufruf der Funktionen nach der Schleife der Wert von i bereits auf 2 gesetzt ist. Um dies zu beheben, verwenden wir eine frühe Bindung durch Einführung der f(i=i)-Syntax . Hier wird der Standardwert für das i-Argument zum Zeitpunkt der Definition festgelegt, was zu einer frühen Bindung führt:

def f(i=i):
    return i

Alternativ sorgt ein komplexerer Ansatz mit einem Abschluss und einer „Funktionsfabrik“ für eine frühe Bindung als Nun:

def make_f(i):
    def f():
        return i
    return f

Innerhalb der Schleife können wir dann f = make_f(i) anstelle der def-Anweisung verwenden.

Das obige ist der detaillierte Inhalt vonWarum geben in einer Python-Schleife erstellte Funktionen alle denselben Wert zurück?. 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