Heim >Backend-Entwicklung >Python-Tutorial >Warum führt das Schließverhalten von Python zu unerwarteten Ergebnissen in verschachtelten Schleifen?

Warum führt das Schließverhalten von Python zu unerwarteten Ergebnissen in verschachtelten Schleifen?

DDD
DDDOriginal
2024-11-29 00:09:12625Durchsuche

Why Does Python's Closure Behavior Produce Unexpected Results in Nested Loops?

Lexikalische Abschlüsse verstehen: Ein genauerer Blick auf Pythons Abschlussverhalten

Beim Eintauchen in die Feinheiten lexikalischer Abschlüsse wird ein eigenartiges Verhalten im Python-Code deutlich. Betrachten Sie das folgende Beispiel:

flist = []

for i in xrange(3):
    def func(x): return x * i
    flist.append(func)

for f in flist:
    print f(2)

Zu unserer Überraschung gibt dieser Code „4 4 4“ anstelle des erwarteten „0 2 4“ aus. Dieses unerwartete Verhalten ergibt sich aus der Art und Weise, wie Python mit lexikalischen Abschlüssen umgeht.

Im Gegensatz zu Perl, das für jede Iteration einen neuen Abschluss erstellt, erstellt Python drei separate Funktionen. Jede Funktion behält jedoch die Geschlossenheit der Umgebung bei, in der sie definiert wurde, nämlich der globalen Umgebung. Dieser gemeinsame Abschluss führt dazu, dass jede Funktion auf dieselbe veränderliche Variable i verweist, was zu der unerwarteten Ausgabe führt.

Um dieses Problem zu beheben, muss eine modifizierte Lösung eingesetzt werden. Indem wir einen Funktionsersteller einführen und ihn innerhalb der Schleife aufrufen, erstellen wir unterschiedliche Umgebungen für jede Funktion mit einem eindeutigen i-Wert:

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 überarbeitete Code behebt das Problem und demonstriert die subtilen, aber signifikanten Unterschiede in der Funktionsweise von Python und Perl verarbeiten lexikalische Abschlüsse. Durch das Verständnis des Abschlussverhaltens der jeweils verwendeten Programmiersprache können Entwickler solche unerwarteten Ergebnisse vermeiden und robusteren und vorhersehbareren Code schreiben.

Das obige ist der detaillierte Inhalt vonWarum führt das Schließverhalten von Python zu unerwarteten Ergebnissen in verschachtelten Schleifen?. 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