Un groupe écrit creer de la façon suivante, qui paraît plus simple
Exercice d'entraînement · niveau 3 (difficile) · NSI (première), chapitre 11 — Conduire un projet · Du sujet au code
Énoncé
Un groupe écrit creer de la façon suivante, qui paraît plus simple :
def creer(n, p):
return [[0] * p] * n
- Quel test du cours échoue, et avec quel message ?
- Expliquer ce qui se passe réellement en mémoire.
- Comment le vérifier en une ligne dans l'interpréteur ?
- Pourquoi
[0] <em> pest-il correct alors que[[0] </em> p] * nne l'est pas ?
Corrigé
1. test_ecriture_independante échoue, avec son message : les lignes partagent la meme memoire ! Les deux autres tests passent — la grille a bien les bonnes dimensions et ne contient que des zéros à la création.
2. [x] <em> n construit une liste de références au même objet x. Ici x est la liste [0] </em> p : les lignes de la grille sont donc une seule et même liste, vue fois. Écrire dans la première écrit dans toutes.
g = [[0] * 2] * 2
g[0][0] = 5
print(g) # [[5, 0], [5, 0]] -- les deux lignes ont change
print(g[0] is g[1]) # True : c'est le meme objet
3. La ligne décisive est g[0] is g[1]. L'opérateur is demande « est-ce le même objet ? », alors que == demande « ont-ils le même contenu ? ». Avec la version correcte, g[0] == g[1] vaut encore True — les deux lignes contiennent bien la même chose — mais g[0] is g[1] vaut False. C'est exactement la distinction que le test attrape.
4. Parce que 0 est un entier, et qu'un entier ne se modifie pas : on ne peut pas « écrire dans un ». Répéter la référence à un objet immuable est sans conséquence. Répéter la référence à un objet mutable — une liste — en a une, puisque modifier l'objet se voit à travers toutes les références.
La règle pratique : * n est sûr sur des nombres, des chaînes et des tuples de nombres ; il est dangereux dès qu'il porte sur une liste ou un dictionnaire.
Ce que cet exercice dit du chapitre : le défaut est invisible à la lecture, invisible à l'affichage juste après la création, et il ne se manifeste qu'à la première écriture. Aucune relecture attentive ne l'attrape de façon fiable ; un test de trois lignes l'attrape à tous les coups. C'est la raison d'être du jeu de tests, en un exemple.
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.