L'effet de bord accidentel
Exercice · informatique (tronc commun des prépas scientifiques), chapitre 10 — Prouver et analyser : la boîte à outils formalisée
Énoncé
Prédire l'affichage du script suivant, diagnostiquer le problème et proposer deux corrections :
def normalise(notes: list) -> list:
m = max(notes)
for i in range(len(notes)):
notes[i] = notes[i] / m
return notes
brutes = [10, 15, 20]
normalisees = normalise(brutes)
print(brutes)Corrigé
Le programme affiche [0.5, 0.75, 1.0]. La liste d'origine brutes a été modifiée par effet de bord. En effet, l'affectation notes[i] = ... modifie directement le contenu de la liste passée en paramètre, qui partage la même zone mémoire en raison de l'absence de copie.
- Correction pure (sans effet de bord) : On crée et renvoie une nouvelle liste en laissant l'originale intacte : ``
python def normalise(notes: list) -> list: m = max(notes) return [x / m for x in notes]`` - Correction avec effet de bord documenté : On assume la modification en place et on supprime le retour pour lever toute ambiguïté : ``
python def normalise(notes: list) -> None: """Modifie la liste notes en place en la normalisant.""" m = max(notes) for i in range(len(notes)): notes[i] /= m``
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.