Verschachtelte Funktionen und Zugriff auf lokale Variablen
In Python können verschachtelte Funktionen aus ihrem umschließenden Bereich auf lokale Variablen zugreifen. Der Zeitpunkt dieses Zugriffs kann jedoch kontraintuitiv sein.
Bedenken Sie den folgenden Codeausschnitt:
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()
Anstatt die erwartete Ausgabe zu erhalten, in der Mary jedes Tier streichelt, zeigt die Ausgabe „Mary streichelt die Katze“ für alle drei Tiere. Dieses Verhalten entsteht, weil die verschachtelte Funktion pet_function die lokale Variable „cage“ zum Zeitpunkt der Ausführung und nicht zum Zeitpunkt der Definition nachschlägt.
Wenn die Funktion get_petters aufgerufen wird, wird die lokale Variable „cage“ nacheinander jedem Tier zugewiesen innerhalb der Schleife. Am Ende der Funktion enthält Cage jedoch den letzten Wert („cat“). Wenn die von get_petters zurückgegebenen Funktionen aufgerufen werden, greifen sie alle auf dieselbe Käfigvariable mit dem Wert „cat“ zu.
Um dieses Problem zu beheben, kann man verschiedene Techniken verwenden, wie zum Beispiel:
Verwenden einer Teilfunktion mit einer gebundenen Käfigvariablen:
from functools import partial def pet_function(cage): print "Mary pets the " + cage.animal + "." yield (animal, partial(gotimes, partial(pet_function, cage=cage)))
Erstellen eines neuen Bereichs für die verschachtelte Funktion:
def scoped_cage(cage): def pet_function(): print "Mary pets the " + cage.animal + "." return pet_function yield (animal, partial(gotimes, scoped_cage(cage)))
Binden der Variablen 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 vonWarum greifen verschachtelte Python-Funktionen zur Ausführungszeit und nicht zur Definitionszeit auf Variablen zu?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!