Prédire l'affichage, puis vérifier
Exercice de TD · niveau 3 (difficile) · NSI (première), chapitre 4 — Les types construits · Matrices, et le piège de la référence partagée
Énoncé
Prédire l'affichage, puis vérifier : ```python
g = [[0] 2] 3 g[1][0] = 9 print(g) ``` Expliquer, puis corriger la construction.
Corrigé
La prédiction que fait presque tout le monde : [[0, 0], [9, 0], [0, 0]].
Ce que la machine affiche :
g = [[0] * 2] * 3
g[1][0] = 9
print(g) # [[9, 0], [9, 0], [9, 0]]
print(g[0] is g[1]) # True
Les trois lignes ont changé.
L'explication. Deux opérateurs * très différents se suivent sur cette ligne :
[0] <em> 2construit un tableau de deux entiers*. Les entiers ne se modifient pas : les partager est sans conséquence ;[ ... ] <em> 3construit un tableau de trois références vers le même tableau*. Il ne recopie rien — il répète.
g[0] is g[1] rend True : ce n'est pas « deux tableaux égaux », c'est un seul tableau désigné trois fois. g[1][0] = 9 le modifie, et les trois noms voient le changement.
La correction.
h = [[0] * 2 for _ in range(3)]
h[1][0] = 9
print(h) # [[0, 0], [9, 0], [0, 0]]
print(h[0] is h[1]) # False
La compréhension réévalue [0] * 2 à chaque tour : trois tableaux distincts sont construits.
Le vrai danger n'est pas l'erreur, c'est son silence. Aucun message, aucune exception : le programme continue et les résultats sont faux — souvent bien plus loin, dans une fonction qui n'a rien à voir. Le réflexe à prendre : une matrice se construit toujours par compréhension, et le test m[0] is m[1] permet de vérifier en une ligne qu'on ne s'est pas fait piéger.
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.