Heim >Backend-Entwicklung >Python-Tutorial >Warum unterscheidet sich das lexikalische Schließungsverhalten von Python von dem von Perl und wie kann dies behoben werden?
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!