À quoi sert le mot-clé global ?

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]
Un instant

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
Un instant

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}")
Un instant

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"
Un instant

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"
Un instant

Bravo, tu es prêt à passer à la suite

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.