[Python] Closure and Unbound LocalError: variable locale «x» référencée avant l'affectation

Cet article est basé sur les résultats de Python 3.7.6.

Pour faire une fermeture en Python, j'ai écrit le code suivant.

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

f()

La fonction «g» fait référence à la variable «x» définie dans le cadre de la fonction «f» et essaie de lui ajouter 1. Cela entraînera une erreur à «x + = 1».

UnboundLocalError: local variable 'x' referenced before assignment

Il dit que la variable locale «x» a été référencée avant l'affectation. En effet, au lieu de référencer «x» dans «f», une autre nouvelle variable a été créée dans «g». Le code ci-dessus peut être réécrit séparément pour faciliter la déclaration et la cession comme suit. Il utilise var comme pseudo syntaxe pour la déclaration de variable.

#Remarque:var n'est pas la syntaxe Python correcte. Voir au dessus
def f():
    var x           #variable locale de f'x'Déclarer
    x = 0           #Remplacez 0 par x
    def g():        #Définir la fonction interne g de f
        var x       #variable locale de g'x'Déclarer
                    #Il arrive que f ait aussi une variable du même nom, mais une autre variable
        x += 1      #Ajouter 1 à x(x = x +1 syntaxe d'enrobage de sucre)
                    #Tente de faire référence à la valeur avant l'ajout, mais une erreur car elle n'a pas encore été attribuée
    g()

Pour exprimer l'intention originale, écrivez comme suit.

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

Ajoutez nonlocal, comme (*). Cela recherchera «x» défini dans la portée externe (un en dehors de «g» = «f»).

Recommended Posts

[Python] Closure and Unbound LocalError: variable locale «x» référencée avant l'affectation
Python> lien> Initialisation et affectation de tableaux 2D