Heim > Backend-Entwicklung > Python-Tutorial > Wie wirken sich Abschlüsse auf den lokalen Variablenzugriff in verschachtelten Python-Funktionen aus?

Wie wirken sich Abschlüsse auf den lokalen Variablenzugriff in verschachtelten Python-Funktionen aus?

Linda Hamilton
Freigeben: 2024-12-18 09:29:18
Original
408 Leute haben es durchsucht

How Do Closures Affect Local Variable Access in Nested Python Functions?

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

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:

  • Teilfunktion:Erstellen Sie eine Teilfunktion und binden Sie das gewünschte Argument als Schlüsselwortparameter.
  • Neuer Funktionsumfang : Erstellen Sie eine neue verschachtelte Funktion, die das gewünschte Argument in ihrem eigenen Bereich erfasst.
  • Bindungsstandard Wert: Binden Sie die Variable als Standardparameterwert an die verschachtelte Funktion.

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!

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