Lexikalische Abschlüsse verstehen: Ein Python-Rätsel
Im Bereich der funktionalen Programmierung spielen lexikalische Abschlüsse eine entscheidende Rolle. Allerdings können bestimmte Programmiersprachen das Verständnis ihres Verhaltens erschweren. Python beispielsweise bietet ein interessantes Rätsel, das das Zusammenspiel von Abschlüssen und Umgebungen veranschaulicht.
Der folgende Python-Codeausschnitt dient als Beispiel:
flist = [] for i in xrange(3): def func(x): return x * i flist.append(func) for f in flist: print f(2)
Dieser Code gibt überraschenderweise „4 4 4“ anstelle des erwarteten „0 2 4“. Während man zunächst vermuten könnte, dass die globale Variable i von den Funktionen gemeinsam genutzt wird, besteht das Problem auch dann weiterhin, wenn i lokal innerhalb einer verschachtelten Funktion deklariert wird.
Der Schlüssel zum Verständnis dieses Verhaltens liegt im Konzept der Abschlüsse. In Python behält jede verschachtelte Funktion den Abschluss ihres enthaltenden Bereichs bei. In diesem Fall teilen sich die verschachtelten Funktionen den Abschluss der globalen Umgebung, einschließlich der veränderlichen Variablen i. Da i während der Schleife geändert wird, verweisen alle Funktionen auf den geänderten Wert.
Um dieses Problem zu umgehen und das gewünschte Verhalten sicherzustellen, kann man auf einen Funktionsersteller-Ansatz zurückgreifen. Durch den Aufruf einer Erstellerfunktion, anstatt Funktionen inline zu erstellen, werden für jede erstellte Funktion unterschiedliche Umgebungen eingerichtet.
Hier ist ein Beispiel des überarbeiteten Codes:
flist = [] for i in xrange(3): def funcC(j): def func(x): return x * j return func flist.append(funcC(i)) for f in flist: print f(2)
Dieser Ansatz generiert effektiv separate Funktionen mit einzigartige Verschlüsse, die zur erwarteten Ausgabe von „0 2 4“ führen.
Während Verschlüsse leistungsstarke Funktionen bieten, kann ihr Zusammenspiel mit Umgebungen subtile Auswirkungen haben Komplexitäten. Eine sorgfältige Abwägung des Umfangs und der Nuancen von Abschlüssen ist unerlässlich, um ihr volles Potenzial auszuschöpfen.
Das obige ist der detaillierte Inhalt vonWarum gibt dieses Beispiel für einen Python-Abschluss „4 4 4' anstelle von „0 2 4' aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!