Adloun

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

Piège du paramètre par défaut mutable

Fonctions et modularité

Énoncé

Corriger la fonction suivante qui vise à ajouter un élément à une liste si celui-ci n'est pas déjà présent, mais qui comporte un bug classique :

# Version buggée
def ajouter_si_absent(element, liste=[]):
    if element not in liste:
        liste.append(element)
    return liste

Présenter la correction et expliquer pourquoi l'original est problématique.

Corrigé

Voici la version corrigée :

# Version corrigée
def ajouter_si_absent(element, liste=None):
    """
    Ajoute un élément à une liste si celui-ci n'y est pas déjà présent.
    Si aucune liste n'est fournie, crée une nouvelle liste.
    """
    if liste is None:
        liste = []
    if element not in liste:
        liste.append(element)
    return liste

# Tests
liste1 = ajouter_si_absent(1)
liste2 = ajouter_si_absent(2)
print(liste1)  # [1]
print(liste2)  # [2] (indépendants, contrairement à la version buggée)

liste3 = [3, 4]
liste4 = ajouter_si_absent(5, liste3)
print(liste3)  # [3, 4, 5] (la liste passée est modifiée)
print(liste4)  # [3, 4, 5]

Dans la version buggée, la liste vide par défaut est créée une seule fois au moment de la définition de la fonction. Tous les appels sans argument liste partagent la même liste en mémoire.

La règle d'or en Python : ne jamais utiliser un objet mutable comme valeur par défaut d'un argument. Utiliser None à la place, puis instancier l'objet mutable dans le corps de la fonction.

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 →