Deux réponses précédentes sont correctes, mais les deux sont un peu floues. Je vais vous montrer quelques exemples:
Le code fonctionnera bien montrer:
>>> gCharlie = "Global!"
>>>
>>> def foo():
... print(gCharlie)
...
>>> foo()
Global!
>>> print(gCharlie)
Global!
Donc ce n'est pas le problème du tout. Cependant, vous ne pouvez pas affecter variables globales dans une fonction:
>>> gCharlie = "Global!"
>>> def foo():
... gCharlie = "Local!"
... print(gCharlie)
...
>>> foo()
Local!
>>> print(gCharlie)
Global!
Comme vous le voyez, la gCharlie variable globale n'a pas changé. C'est parce que vous ne l'avez pas modifié, vous avez créé une nouvelle variable locale, avec le même nom. Et c'est la cause de l'erreur:
>>> gCharlie = "Global!"
>>> def foo():
... oldCharlie = gCharlie
... gCharlie = "Local!"
... print(gCharlie)
...
>>> foo()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in foo
UnboundLocalError: local variable 'gCharlie' referenced before assignment
L'indice est dans l'erreur.Il est dit local variable gCharlie. Le problème n'est pas l'impossibilité d'accéder au global gCharlie, mais le local n'a pas encore été créé. Le correctif consiste à spécifier que vous ne voulez pas créer une variable locale, mais que vous voulez modifier la variable globale. Vous faites cela avec le mot-clé global.
>>> gCharlie = "Global!"
>>> def foo():
... global gCharlie
... oldCharlie = gCharlie
... gCharlie = "Local!"
... print(gCharlie)
...
>>> foo()
Local!
>>> print(gCharlie)
Local!
Comme vous le voyez maintenant, vous avez modifié la variable globale. Cela dit, les variables globales sont généralement une mauvaise idée. Évite-les. Essayez de transmettre les variables en tant que paramètres à la place.
J'ai couru ce code moi-même et n'ai pas eu de telles erreurs. Peut-être fournir le code qui appelle cette fonction? Est-ce dans un fichier séparé? Comment l'importez-vous si c'est le cas? etc –
J'ai essayé ce qui précède dans deux versions différentes de Python et il a parfaitement fonctionné. – senderle