[Python] Closure und Unbound LocalError: Lokale Variable 'x', auf die vor der Zuweisung verwiesen wird

Dieser Artikel basiert auf den Ergebnissen von Python 3.7.6.

Um einen Abschluss in Python zu machen, habe ich den folgenden Code geschrieben.

def f():
    x = 0
    def g():
        x += 1
    g()

f()

Die Funktion "g" bezieht sich auf die Variable "x", die im Rahmen der Funktion "f" definiert ist, und versucht, 1 hinzuzufügen. Dies führt zu einem Fehler bei "x + = 1".

UnboundLocalError: local variable 'x' referenced before assignment

Es heißt, dass die lokale Variable "x" vor der Zuweisung referenziert wurde. Dies liegt daran, dass wir eine weitere neue Variable in "g" erstellt haben, anstatt auf "x" in "f" zu verweisen. Der obige Code kann zur Vereinfachung der Deklaration und Zuweisung wie folgt separat umgeschrieben werden. Es verwendet var als Pseudosyntax für die Variablendeklaration.

#Hinweis:var ist nicht die richtige Python-Syntax. Siehe oben
def f():
    var x           #lokale Variable von f'x'Erklären
    x = 0           #Ersetzen Sie x durch 0
    def g():        #Definieren Sie die interne Funktion g von f
        var x       #lokale Variable von g'x'Erklären
                    #Es kommt vor, dass f auch eine Variable mit demselben Namen hat, aber eine andere Variable
        x += 1      #Addiere 1 zu x(x = x +1 Zuckerüberzugssyntax)
                    #Versuche, vor dem Hinzufügen auf den Wert zu verweisen, aber ein Fehler, da er noch nicht zugewiesen wurde
    g()

Um die ursprüngliche Absicht auszudrücken, schreiben Sie wie folgt.

def f():
    x = 0
    def g():
        nonlocal x   ## (*)
        x += 1
    g()

Fügen Sie nonlocal hinzu, wie (*). Dies sucht nach "x", das im äußeren Bereich definiert ist (eines außerhalb von "g" = "f").

Recommended Posts

[Python] Closure und Unbound LocalError: Lokale Variable 'x', auf die vor der Zuweisung verwiesen wird
Python> Link> Initialisierung und Zuweisung von 2D-Arrays