Le mot-clé global est utilisé à l'intérieur d'une fonction pour indiquer que l'on souhaite modifier une variable qui a été définie dans l'espace global du script (hors de la fonction).
Objets muables et immuables
Les types muables comme les listes et les dictionnaires n'ont pas besoin du mot-clé global pour être modifiés.
ma_liste = [1] def ajouter_element(): # On MODIFIE le contenu de la liste. On ne la réassigne pas. # Python trouve la variable globale et la modifie directement. ma_liste.append(2) ajouter_element() print(f"Liste finale : {ma_liste}") # Affiche [1, 2]
Ici nous modifions directement notre objet ma_liste.
Les types immuables, comme les nombres ou les chaînes de caractères, ne peuvent à l'inverse pas être modifiés de cette façon, sans le mot-clé global.
Si on essaye d'assigner une nouvelle valeur à une variable immuable sans le mot-clé global , Python pense que l'on veut créer une nouvelle variable locale à la fonction.
score = 0 def augmenter_score(): score += 1 augmenter_score() # Le code ci-dessus déclenche une erreur : UnboundLocalError
Pourquoi cette erreur ?
Tout d'abord il faut bien comprendre que score += 1 est une façon raccourcie d'écrire score = score + 1.
Quand Python voit score += 1 il considère donc qu'il doit créer une nouvelle variable, locale à la fonction (quand on crée une variable dans une fonction, elle est par défaut locale à la fonction et n'existe pas en dehors. Voir notre glossaire à ce sujet).
Sauf que, pour savoir quelle valeur Python doit assigner à cette nouvelle variable score, locale à la fonction, il doit d'abord connaître la valeur de score (car on assigne score + 1, Python doit donc chercher la valeur de score).
Python regarde dans la fonction s'il trouve une variable score, sauf qu'elle n'existe pas, d'où l'erreur UnboundLocalError.
Il faut alors dire explicitement à Python, avec le mot-clé global, que vous souhaitez utiliser la variable globale score, définie en dehors de la fonction :
score = 0 def augmenter_score(): global score score += 1 augmenter_score() print(f"Score: {score}")
En rajoutant global score, Python sait cette fois-ci qu'il doit aller lire la valeur de la variable globale pour créer la nouvelle variable score.
À noter
Cette erreur n'arrivera pas si vous souhaitez uniquement lire la valeur d'une variable définie en dehors de la fonction.
compteur = 100 def afficher_compteur(): # Accès en lecture simple, pas de 'global' nécessaire print(f"La valeur du compteur est : {compteur}") afficher_compteur() # Affiche "La valeur du compteur est : 100"
Alternative à global
L'utilisation de global est généralement déconseillée. 99% du temps elle résulte d'une mauvaise construction du code.
On préfèrera passer les variables en paramètres pour garder les règles de "scope" (voir notre glossaire dédié).
def augmenter_score(score_actuel): return score_actuel + 1 score = 0 # La fonction prend une valeur et en retourne une nouvelle. # La modification est explicite. score = augmenter_score(score) print(f"Score final : {score}") # Affiche "Score final : 1"