Adloun

Deux noms, une seule liste

Exercice de TD · niveau 3 (difficile) · sciences numériques et technologie (seconde), chapitre 6 — Listes et simulations aléatoires · Manipuler une liste

Énoncé

Prédire l'affichage de ce programme, l'exécuter, puis expliquer.

A = [1, 2, 3]
B = A
B.append(4)
print(A)
print(B)

Comparer avec le comportement de deux nombres (x = 10 ; y = x ; y = y + 1). Comment obtenir une vraie copie ?

Corrigé

L'affichage est [1, 2, 3, 4] deux fois. Modifier B a modifié A.

Explication. B = A ne crée aucune nouvelle liste : il donne un second nom à la même liste en mémoire. B.append(4) modifie cet unique objet, que les deux noms désignent.

Le contraste avec les nombres est frappant :

x = 10
y = x
y = y + 1
print(x, y)   # 10 11 : x n'a pas bougé

Mais la différence n'est pas de nature — elle vient de l'opération. y = y + 1 est une réaffectation : elle fait pointer y ailleurs, sans toucher à ce que x désigne. B.append(4) est une modification sur place : l'objet lui-même change, et tous ses noms en subissent l'effet. Un nombre ne peut pas être modifié sur place, une liste si.

Pour obtenir une vraie copie, trois écritures équivalentes :

C = A.copy()
C = list(A)
C = A[:]

C'est un des pièges les plus coûteux du langage, parce qu'il ne provoque aucune erreur : le programme tourne, et une liste que l'on croyait intacte a changé, souvent très loin de l'endroit fautif.

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.