Adloun

Python (école d'ingénieur) · Chapitre 4 · Exercice

Variable non locale (nonlocal)

Fonctions et modularité

Énoncé

Écrire une fonction fabrique_compteur() qui contient une variable locale compteur et une fonction imbriquée incrementer(). Cette fonction imbriquée doit pouvoir modifier la variable compteur de la fonction englobante. Utiliser le mot-clé nonlocal.

Corrigé

Voici l'implémentation utilisant une clôture :

def fabrique_compteur():
    """Retourne une fonction qui incrémente et retourne un compteur."""
    compteur = 0

    def incrementer():
        nonlocal compteur # Permet de modifier la variable de la fonction englobante
        compteur += 1
        return compteur

    return incrementer

# Création de deux compteurs indépendants
compteur1 = fabrique_compteur()
compteur2 = fabrique_compteur()

print(compteur1()) # 1
print(compteur1()) # 2
print(compteur2()) # 1 (indépendant)
print(compteur1()) # 3
print(compteur2()) # 2

Le mot-clé nonlocal est l'équivalent de global mais pour les variables de la portée englobante (enclosing scope). Sans nonlocal, l'affectation compteur += 1 créerait une variable locale compteur dans incrementer() au lieu de modifier celle de fabrique_compteur().

Cette technique (clôture) est une alternative élégante aux variables globales pour créer des états persistants et encapsulés.

100 % gratuit

La suite du chapitre est sur Adloun

Exercice suivant et tuteur

Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant et tuteur →