Lokale Variablen in verschachtelten Funktionen: Eine Geschichte von Schließung und Suche
In Python können lokale Variablen, die in verschachtelten Funktionen definiert sind, mit der Umgebung interagieren Umfang. Um diese Interaktion zu verstehen, schauen wir uns einen Codeausschnitt an, der das Verhalten hervorhebt.
from functools import partial class Cage(object): def __init__(self, animal): self.animal = animal def gotimes(do_the_petting): do_the_petting() def get_petters(): for animal in ['cow', 'dog', 'cat']: cage = Cage(animal) def pet_function(): print "Mary pets the " + cage.animal + "." yield (animal, partial(gotimes, pet_function)) funs = list(get_petters()) for name, f in funs: print name + ":", f()
Mehrdeutige Zuweisung
Das Ausführen dieses Codes führt zu einem unerwarteten Ergebnis: „Mary streichelt.“ Für alle drei Tiere („Kuh“, „Hund“ und „Katze“) wird „die Katze“ gedruckt. Dies liegt daran, dass der lokale Variablenkäfig innerhalb der verschachtelten Funktion pet_function als Abschlusszelle erfasst wird.
Abschlusszelle
Wenn die verschachtelte Funktion erstellt wird, verweist sie auf die lokale Variablen im übergeordneten Bereich. In diesem Fall ist Cage die einzige freie Variable in pet_function und an eine Abschlusszelle gebunden. Diese Zelle ermöglicht der Funktion den Zugriff auf die Variable des äußeren Bereichs, auch nachdem die übergeordnete Funktion zurückkehrt.
Bereichsauflösung
Das Problem tritt jedoch auf, wenn die verschachtelte Funktion ausgeführt wird. Der Wert des Käfigs wird zum Zeitpunkt der Ausführung im umgebenden Bereich nachgeschlagen, nicht in der Definition. In unserem Fall wurde der Käfigvariablen im umgebenden Bereich zum Zeitpunkt des Aufrufs der Funktionen bereits „cat“ als endgültiger Wert zugewiesen.
Problemumgehungen
Um diese Mehrdeutigkeit aufzulösen, müssen wir den Abschluss aufheben und verhindern, dass die verschachtelte Funktion direkt auf den umgebenden Bereich zugreift. Hier sind einige Problemumgehungen:
Durch die Verwendung dieser Problemumgehungen können wir sicherstellen, dass die verschachtelte Funktion Zugriff auf die richtigen lokalen Variablen hat und Unklarheiten vermeiden unser Code.
Das obige ist der detaillierte Inhalt vonWie wirken sich Abschlüsse auf den lokalen Variablenzugriff in verschachtelten Python-Funktionen aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!