La portée des variables en Python

1. Qu’est-ce que la portée d’une variable ?

La portée (ou scope en anglais) d’une variable désigne l’endroit du programme où cette variable est accessible.

Il existe deux grands types de portée en Python :

  • La portée locale
  • La portée globale

2. La portée locale

Une variable est dite locale lorsqu’elle est déclarée à l’intérieur d’une fonction. Elle n’est accessible que dans cette fonction.

Exemple :

def saluer():
    message = "Bonjour !"
    print(message)

saluer()
print(message)  # Erreur : la variable message n'existe pas ici

➡️ Ici, message est locale à la fonction saluer(). Elle n'existe pas en dehors de cette fonction.


3. La portée globale

Une variable est globale lorsqu’elle est déclarée en dehors de toute fonction. Elle est alors accessible dans tout le programme, y compris dans les fonctions (en lecture uniquement).

Exemple :

nom = "Alice"  # variable globale

def afficher_nom():
    print(nom)  # OK : on lit une variable globale

afficher_nom()

✅ Ici, nom est accessible dans la fonction car on ne la modifie pas.


4. Modifier une variable globale dans une fonction

Si l’on veut modifier une variable globale depuis une fonction, il faut utiliser le mot-clé global.

Exemple :

compteur = 0

def incrementer():
    global compteur
    compteur += 1

incrementer()
print(compteur)  # Affiche : 1

⚠️ Sans le mot-clé global, Python crée une nouvelle variable locale au lieu de modifier la variable globale.


5. Variables locales avec le même nom qu’une variable globale

Quand une variable locale a le même nom qu’une variable globale, la variable locale masque la variable globale dans la fonction.

Exemple :

x = 10

def test():
    x = 5  # variable locale
    print("Dans la fonction :", x)

test()
print("En dehors de la fonction :", x)

➡️ Affiche :

Dans la fonction : 5
En dehors de la fonction : 10

6. Les fonctions imbriquées (bonus)

Quand une fonction est définie à l’intérieur d’une autre, on peut utiliser le mot-clé nonlocal pour modifier une variable dans la fonction parente (mais pas globale).

def exterieure():
    x = 1
    def interieure():
        nonlocal x
        x = 2
    interieure()
    print(x)  # Affiche : 2

🧠 À retenir

Type de variable Où est-elle déclarée ? Où est-elle accessible ?
Locale Dans une fonction Uniquement dans cette fonction
Globale En dehors de toute fonction Partout, sauf si masquée
global Dans une fonction Modifie une variable globale
nonlocal Dans une fonction imbriquée Modifie une variable dans la fonction parente

📝 Exercices

Exercice 1 – Variables locales

def bonjour():
    prenom = "Julie"
    print("Bonjour", prenom)

bonjour()
print(prenom)  # Que va-t-il se passer ici ?
  • ➤ Prédisez l’erreur affichée.
  • ➤ Expliquez pourquoi.

Exercice 2 – Portée globale et lecture

message = "Bienvenue"

def affiche():
    print(message)

affiche()
  • ➤ Que s’affiche-t-il ?
  • ➤ La variable message est-elle globale ou locale ?

Exercice 3 – Portée globale et écriture

valeur = 100

def change():
    valeur = 50

change()
print(valeur)
  • ➤ Que s’affiche-t-il ?
  • ➤ Pourquoi la variable valeur n’a-t-elle pas changé ?

Exercice 4 – Correction avec global

Reprenez l’exercice 3 et modifiez-le pour que l’appel à change() modifie bien la variable globale.


Exercice 5 – Application concrète

Complétez le programme suivant pour que la fonction ajouter() ajoute 1 au compteur global à chaque appel :

compteur = 0

def ajouter():
    # Complétez ici

ajouter()
ajouter()
print(compteur)  # Doit afficher : 2