Lokale Variablen in verschachtelten Funktionen
Dieses komplizierte Beispiel betrifft verschachtelte Funktionen und Abschlüsse, die zu verwirrendem Verhalten führen können. Lassen Sie uns das Rätsel lösen.
Ausführung verschachtelter Funktionen
Verschachtelte Funktionen greifen bei ihrer Ausführung auf Variablen aus dem übergeordneten Bereich zu. In diesem Fall ist die pet_function eine verschachtelte Funktion innerhalb des get_petters-Generators. Bei der Ausführung wird nach Variablen im Bereich von get_petters gesucht.
Abschlusszellen und lokale Variablen
Die pet_function verfügt über eine freie Variable (Käfig). Bei der Kompilierung wird diese freie Variable durch eine Abschlusszelle dargestellt. Wenn pet_function ausgeführt wird, überprüft diese Abschlusszelle den Wert von Cage im umgebenden Bereich von get_petters.
Dynamische Suchvorgänge und Abschlüsse
Das problematische Verhalten tritt auf, wenn die Funs-Liste angezeigt wird entsteht. Zu diesem Zeitpunkt hat der Käfig in get_petters den Wert „cat“. Wenn jede Funktion in funs aufgerufen wird, sucht die Abschlusszelle in pet_function nach dem Wert von Cage zum Zeitpunkt dieses Funktionsaufrufs, nicht zum Zeitpunkt seiner Definition.
Zugriff auf verschiedene Tiere
Um dieses Problem zu beheben, muss pet_function für jedes Tier auf eine bestimmte Instanz des Käfigobjekts zugreifen. Dies kann durch Teilfunktionen, neue Funktionsumfänge oder Schlüsselwortparameter erreicht werden.
Teilfunktion
Eine Teilfunktion erstellt eine neue Funktion mit festen Parametern. Hier ist ein Beispiel mit functools.partial():
def pet_function(cage=None): print("Mary pets the " + cage.animal + ".") yield (animal, partial(gotimes, partial(pet_function, cage=cage)))
Neuer Funktionsumfang
Das Erstellen eines neuen Funktionsumfangs stellt sicher, dass die Käfigvariable innerhalb des neu definierten gebunden ist Funktion.
def scoped_cage(cage=None): def pet_function(): print("Mary pets the " + cage.animal + ".") return pet_function yield (animal, partial(gotimes, scoped_cage(cage)))
Schlüsselwortparameter
Bindung die Käfigvariable als Standardwert für einen Schlüsselwortparameter:
def pet_function(cage=cage): print("Mary pets the " + cage.animal + ".") yield (animal, partial(gotimes, pet_function))
Das obige ist der detaillierte Inhalt vonWie gehen verschachtelte Funktionen mit lokalen Variablen und Abschlüssen in Python um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!