Adloun

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

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.