Heim > Backend-Entwicklung > Python-Tutorial > Warum unterscheidet sich das lexikalische Schließungsverhalten von Python von dem von Perl?

Warum unterscheidet sich das lexikalische Schließungsverhalten von Python von dem von Perl?

Patricia Arquette
Freigeben: 2024-12-12 16:42:10
Original
122 Leute haben es durchsucht

Why Does Python's Lexical Closure Behavior Differ from Perl's?

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

Ü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";
}
Nach dem Login kopieren

Der Basiswert Unterschied

Der Hauptunterschied liegt darin, wie Abschlüsse ihre Umgebung erfassen.

  • Python:Funktionen, die innerhalb einer Schleife erstellt werden, teilen alle den Abschluss der Schleife Umfeld. Da die Schleifenvariable i geändert wird, verweisen alle Funktionen auf dasselbe geänderte i.
  • Perl: Innerhalb einer Schleife erstellte Funktionen haben jeweils ihren eigenen Abschluss und erfassen den Wert von i zum Zeitpunkt ihrer Eingabe sind definiert.

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

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!

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