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»).