Heim > Backend-Entwicklung > Python-Tutorial > Warum gibt dieses Beispiel für einen Python-Abschluss „4 4 4' anstelle von „0 2 4' aus?

Warum gibt dieses Beispiel für einen Python-Abschluss „4 4 4' anstelle von „0 2 4' aus?

Patricia Arquette
Freigeben: 2024-11-29 08:12:10
Original
186 Leute haben es durchsucht

Why Does This Python Closure Example Print

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

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

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!

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