Heim >Backend-Entwicklung >Python-Tutorial >Warum greifen verschachtelte Python-Funktionen zur Ausführungszeit und nicht zur Definitionszeit auf Variablen zu?

Warum greifen verschachtelte Python-Funktionen zur Ausführungszeit und nicht zur Definitionszeit auf Variablen zu?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-24 13:27:30960Durchsuche

Why Do Nested Python Functions Access Variables at Execution Time, Not Definition Time?

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!

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