Heim >Backend-Entwicklung >Python-Tutorial >Warum unterscheidet sich das lexikalische Schließungsverhalten von Python von dem von Perl und wie kann dies behoben werden?

Warum unterscheidet sich das lexikalische Schließungsverhalten von Python von dem von Perl und wie kann dies behoben werden?

Barbara Streisand
Barbara StreisandOriginal
2024-12-01 14:46:13784Durchsuche

Why Does Python's Lexical Closure Behavior Differ from Perl's, and How Can This Be Resolved?

Lexikalische Abschlüsse in Python verstehen: Eine tiefergehende Untersuchung

Im Bereich der Programmierung spielen lexikalische Abschlüsse eine entscheidende Rolle bei der Aufrechterhaltung des Zugriffs auf Variablen und Funktionen, die in umschließenden Bereichen definiert sind. Bei der Arbeit mit Abschlüssen in Python kann jedoch ein verwirrendes Phänomen auftreten.

Abschlussrätsel in Python

Bedenken 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 dieser Code „4 4 4“ anstelle des erwarteten „0 2 4“ aus. Um dieses Verhalten zu verstehen, müssen wir uns mit der Natur lexikalischer Abschlüsse in Python befassen.

Verschlussverhalten in Python und Perl

In Python behalten Abschlüsse Verweise auf Variablen bei im umschließenden Geltungsbereich. Wenn diese Variablen jedoch innerhalb dieses Bereichs geändert werden, erfassen die Abschlüsse die geänderten Werte, was zu unerwarteten Ergebnissen führt.

Dieses Verhalten steht im Gegensatz zu Perl, wo Abschlüsse die Umgebung zum Zeitpunkt ihrer Erstellung erfassen. Im Perl-Code:

my @flist = ();

foreach my $i (0 .. 2) {
    push(@flist, sub {$i * $_[0]});
}

Jeder Abschluss erfasst den Wert von $i zum Zeitpunkt seiner Erstellung, was zur erwarteten Ausgabe führt: „0 2 4.“

Das Rätsel lösen

Um das Problem in Python zu lösen, können wir Funktionen innerhalb einer anderen Funktion erstellen, um die Abschlüsse zu isolieren. Umgebungen.

flist = []

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

outer()

for f in flist:
    print f(2)

Hier erstellt jede Iteration der äußeren Schleife eine neue Funktion, die ihre eigene Umgebung und einen eindeutigen Wert von i hat. Als Ergebnis erhalten wir die gewünschte Ausgabe: „0 2 4.“

Fazit

Lexikalische Abschlüsse bieten einen leistungsstarken Mechanismus für den bereichsübergreifenden Zugriff auf Variablen und Funktionen. In Python ist es jedoch wichtig, die Auswirkungen des Schließens über veränderliche Variablen zu verstehen, da dies zu unerwartetem Verhalten führen kann. Durch sorgfältiges Management der Umgebungen, in denen Schließungen erstellt werden, können wir ihr volles Potenzial nutzen und gleichzeitig Fallstricke vermeiden.

Das obige ist der detaillierte Inhalt vonWarum unterscheidet sich das lexikalische Schließungsverhalten von Python von dem von Perl und wie kann dies behoben werden?. 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