Aller au contenu

un professeur veut relever ses notes⚓︎

Un professeur a relevé la liste des notes obtenues dans un groupe à une évaluation. (liste_1).

Il désire relever toutes les notes d’1 point, mais il veut garder pour lui la liste originale.

Voici son script et le résultat obtenu à l’exécution :

Testez

liste_2 = liste_1

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Shift+Esc ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

🌵 On observe que le professeur a « perdu » la liste originale liste_1, qui est devenu identique à la liste_2.

👉 En effet, tout se passe comme si l’instruction liste_2 = liste_1 donnait deux noms différents au même objet.

liste_2 n’est pas une nouvelle liste.

Il y a plusieurs syntaxes possibles pour remédier à ce problème : en voici quelques unes.

Testez

liste_2 = list(liste_1)

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Shift+Esc ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Testez

liste_2 = liste_1[:]

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Shift+Esc ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Testez

liste_2 = liste_1.copy()

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Shift+Esc ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Testez

liste_2 = [note for note in liste_1] avec une liste en compréhension

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Shift+Esc ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Un autre exemple avec des fruits :⚓︎

🌵 Comme on peut le voir, lors de sa création, fruits_2 pointe vers le même objet de type list : fruits_1.

😏 Le fait de modifier fruits_2, modifie donc forcément fruits_1.

👉 Ce mécanisme est très important et il faudra le garder à l'esprit.