Heim >Backend-Entwicklung >Python-Tutorial >Warum unterscheidet sich das lexikalische Schließungsverhalten von Python von dem von Perl?
Entschlüsselung lexikalischer Abschlüsse in Python vs. Perl
Bei der Untersuchung lexikalischer Abschlüsse in Javascript stellt sich die Frage nach ihrem besonderen Verhalten in Python. Betrachten Sie den folgenden Python-Code:
flist = [] for i in xrange(3): def func(x): return x * i flist.append(func) for f in flist: print f(2)
Überraschenderweise gibt er „4 4 4“ anstelle des erwarteten „0 2 4“ aus.
Im Gegensatz dazu erzeugt dieser äquivalente Perl-Code das Gewünschte Ergebnis:
my @flist = (); foreach my $i (0 .. 2) { push(@flist, sub {$i * $_[0]}); } foreach my $f (@flist) { print $f->(2), "\n"; }
Der Basiswert Unterschied
Der Hauptunterschied liegt darin, wie Abschlüsse ihre Umgebung erfassen.
Eine Python-Lösung
Um das erwartete Verhalten in Python zu erreichen, benötigen Sie um für jede Funktion separate Umgebungen zu erzwingen. Eine Lösung besteht darin, einen Funktionsersteller zu erstellen, der eine Funktion mit einem anderen Abschluss zurückgibt:
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)
Diese Methode stellt sicher, dass jede Funktion ihren eigenen Abschluss mit ihrem eigenen eindeutigen Wert von i hat.
Das obige ist der detaillierte Inhalt vonWarum unterscheidet sich das lexikalische Schließungsverhalten von Python von dem von Perl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!