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
- 7 autres exercices corrigés dans ce chapitre, et 7 à chercher avec le tuteur
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.