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
Patricia ArquetteOriginal
2024-12-12 16:42:10133Durchsuche

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)

Ü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.

  • 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)

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!

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