Adloun

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.