Qu'est-ce que je fais de mal ici ?
counter = 0
def increment():
counter += 1
increment()
Le code ci-dessus lance un UnboundLocalError
.
Qu'est-ce que je fais de mal ici ?
counter = 0
def increment():
counter += 1
increment()
Le code ci-dessus lance un UnboundLocalError
.
Pour modifier une variable globale dans une fonction, vous devez utiliser le mot-clé global.
Lorsque vous essayez de faire cela sans la ligne
global counter
à l'intérieur de la définition d'increment, une variable locale nommée counter est créée afin de vous empêcher d'altérer la variable counter dont tout le programme peut dépendre.
Notez que vous n'avez besoin d'utiliser global que lorsque vous modifiez la variable ; vous pourriez lire le compteur à partir de l'incrément sans avoir besoin de l'instruction globale.
Python n'est pas purement lexical scoped.
Regardez ça : Utilisation de variables globales dans une fonction
et ceci : https://www.saltycrane.com/blog/2008/01/python-variable-scope-notes/
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
1 votes
Cette question et celle dont elle est actuellement le double sont en cours de discussion au sein de la Chatroom Python .
5 votes
Beaucoup de réponses ici disent d'utiliser
global
et bien que cela fonctionne, l'utilisation de globaux modifiables est généralement no recommander lorsque d'autres options existent.21 votes
@ZeroPiraeus Une question posée en 2012 ne peut pas être un doublon d'une question posée en 2016 ... plutôt la plus récente est le doublon.
10 votes
@dsh Ce n'est pas vrai. .
0 votes
@juanpa.arrivillaga c'est bien que la question générale est fermeture et de mettre à jour une liaison qui n'est pas locale. UnboundLocalError peut également se produire pour des variables entièrement locales, mais il s'agit d'un problème différent (avec une solution différente).
0 votes
@Masklinn oui, mais un la fermeture n'est pas créée dans ce cas . Vous pouvez vérifier,
print(increment.__closure__)
0 votes
@juanpa.arrivillaga c'est un détail d'implémentation. C'est conceptuellement une fermeture, même si Python différencie les globaux et les non-locaux non globaux. La question et la réponse primaire sont pertinentes pour le problème dans les deux cas.
0 votes
@Masklinn OK, tu m'as convaincu. Je suppose qu'au sens large, une variable libre est toute variable non locale. N'hésitez pas à revenir en arrière