Heim >Backend-Entwicklung >Python-Tutorial >Warum führt das Schließverhalten von Python zu unerwarteten Ergebnissen in verschachtelten Schleifen?
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!