Adloun

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.