Le piège de la copie de listes de listes
Exercice supplémentaire · niveau 3 (difficile) · sciences numériques et technologie (seconde), chapitre 6 — Listes et simulations aléatoires · Manipuler une liste
Énoncé
Exécuter ce programme et expliquer pourquoi copy() ne suffit pas ici.
A = [[1, 2], [3, 4]]
B = A.copy()
B[0][0] = 99
print(A)Corrigé
L'affichage est [[99, 2], [3, 4]] : A a changé malgré la copie.
**copy() fait une copie superficielle. Il crée bien une nouvelle liste extérieure, mais celle-ci contient les mêmes** sous-listes que l'originale — ce sont les mêmes objets, portant simplement deux noms. Modifier B[0][0] modifie la sous-liste partagée.
On le vérifie en remplaçant un élément entier :
B[0] = [7, 8] # là, A n'est pas touchée
Pour une copie complète, il faut une copie profonde :
import copy
B = copy.deepcopy(A)
Ce piège est le même que celui de B = A, d'un cran plus loin — et il est plus dangereux, parce qu'on croit s'en être prémuni. C'est la source classique du bogue où toutes les lignes d'un tableau créé par [[0] <em> 3] </em> 3 changent ensemble.
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.