Que fait ce code ? Prédire l'affichage, puis l'exécuter. python def…
Exercice supplémentaire · niveau 2 · NSI (première), chapitre 4 — Les types construits · Références partagées, copies et effets de bord
Énoncé
Que fait ce code ? Prédire l'affichage, puis l'exécuter.
def ajouter(x, t=[]):
t.append(x)
return t
print(ajouter(1))
print(ajouter(2))
Expliquer, puis corriger.
Corrigé
La prédiction naturelle : [1] puis [2].
Ce que la machine affiche :
[1]
[1, 2]
Le deuxième appel retrouve le tableau du premier.
L'explication. La valeur par défaut [] est évaluée une seule fois, au moment où la fonction est définie — pas à chaque appel. Tous les appels sans second argument partagent donc le même tableau, qui se remplit au fil du programme. On peut le vérifier :
a = ajouter(1)
b = ajouter(2)
print(a is b) # True : c'est le meme tableau
La correction, qui est la seule.
def ajouter(x, t=None):
"""Ajoute x a t, ou a un nouveau tableau si t n'est pas fourni."""
if t is None:
t = []
t.append(x)
return t
print(ajouter(1)) # [1]
print(ajouter(2)) # [2]
None est immuable : la partager est sans conséquence, et le tableau vide est créé à l'appel, pas à la définition.
La règle, sans exception : jamais de valeur par défaut modifiable — ni tableau, ni dictionnaire (chapitre 5). Le défaut est d'autant plus dangereux qu'il ne se manifeste qu'au deuxième appel : un jeu de tests qui n'appelle la fonction qu'une fois par cas ne le verra jamais.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.