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
Freigeben: 2024-12-24 13:27:30
Original
918 Leute haben es durchsucht

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()
Nach dem Login kopieren

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)))
    Nach dem Login kopieren
  • 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)))
    Nach dem Login kopieren
  • 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))
    Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage