Liste de listes☘
Exercice 1☘
Quel affichage obtient-on avec le code suivant:
1 2 3 4 5 6 7 8 9 10 11 | t = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] s = [ [valeur for valeur in ligne] for ligne in t] s[0][0] = 42 print("s = ", s) print("t = ", t) |
Une réponse
On obtient:
1 2 | s = [[42, 2, 3], [4, 5, 6], [7, 8, 9]] t = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] |
Exercice 2☘
Quel affichage obtient-on avec le code suivant:
1 2 3 4 5 6 7 8 9 10 11 | t = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] s = [ ligne for ligne in t] s[0][0] = 42 print("s = ", s) print("t = ", t) |
Justifier les différences de résultats obtenus avec l'exercice précédent.
Ce que l'on obtient
On obtient:
1 2 | s = [[42, 2, 3], [4, 5, 6], [7, 8, 9]] t = [[42, 2, 3], [4, 5, 6], [7, 8, 9]] |
Cette fois, la modification faite sur s apparaît aussi sur t.
Des id pour mieux saisir
On fait afficher quelques id dans les codes des exercices 1 et 2 pour mieux comprendre.
Code de l'exercice 2:☘
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | t = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] s = [ ligne for ligne in t] print("*"*30 + "\nAvec is:\n") print(f"Est ce que s est t? {s is t}.\n") for i in range(len(t)): print(f"Est ce que t[{i}] est s[{i}]? {t[i] is s[i]}.") print("\n" + "*"*30 + "\n") print(f"id(t) = {id(t)}.") print(f"id(s) = {id(s)}.") print() for i in range(len(t)): print(f"id(t[{i}]) = {id(t[i])}.") print(f"id(s[{i}]) = {id(s[i])}.") print() |
On obtient:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | ****************************** Avec is: Est ce que s est t? False. Est ce que t[0] est s[0]? True. Est ce que t[1] est s[1]? True. Est ce que t[2] est s[2]? True. ****************************** id(t) = 139749660567496. id(s) = 139749640054280. id(t[0]) = 139749661056904. id(s[0]) = 139749661056904. id(t[1]) = 139749661056968. id(s[1]) = 139749661056968. id(t[2]) = 139749640054664. id(s[2]) = 139749640054664. |
Dans s
, chaque sous-liste désigne le même objet liste que la sous-liste de même rang dans t
.
En d'autres termes, le code s = [ ligne for ligne in t]
est équivalent au suivant:
1 2 3 | s = [] for i in range(len(t)): s.append(t[i]) |
Avec le code de l'exercice 1:☘
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | t = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] s = [ [valeur for valeur in ligne] for ligne in t] print("*"*30 + "\nAvec is:\n") print(f"Est ce que s est t? {s is t}.\n") for i in range(len(t)): print(f"Est ce que t[{i}] est s[{i}]? {t[i] is s[i]}.") print("\n" + "*"*30 + "\n") print(f"id(t) = {id(t)}.") print(f"id(s) = {id(s)}.") print() for i in range(len(t)): print(f"id(t[{i}]) = {id(t[i])}.") print(f"id(s[{i}]) = {id(s[i])}.") print() |
On obtient:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | ****************************** Avec is: Est ce que s est t? False. Est ce que t[0] est s[0]? False. Est ce que t[1] est s[1]? False. Est ce que t[2] est s[2]? False. ****************************** id(t) = 140336034875464. id(s) = 140336034875528. id(t[0]) = 140336055877512. id(s[0]) = 140336055388168. id(t[1]) = 140336055877576. id(s[1]) = 140336034875144. id(t[2]) = 140336034875208. id(s[2]) = 140336055387528. |
Avec le code 1, on n'a pas copié les sous-listes de t comme éléments de s. On a créé des sous-listes dans s, dans lesquelles on a copié les éléments des sous-listes correspondantes de t. Une modification de s[0][0] n'entraîne pas, dans l'exercice 1, de modification de t[0][0] parce que les listes s[0] et t[0] désignent des listes distinctes (bien que de même contenu initialement).
Exercice 3☘
Quel affichage avec le code:
1 2 3 4 5 6 7 8 9 10 11 12 | t = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] s = [ ligne for ligne in t] s[0] = [666, 42, 777] print(t) print(s) |
Réponse
On obtient:
1 2 | [[1, 2, 3], [4, 5, 6], [7, 8, 9]] [[666, 42, 777], [4, 5, 6], [7, 8, 9]] |
La modification de s ne perturbe pas t.
En effet s est une liste distincte de t (même si elle contient les mêmes objets listes que t).
Par ailleurs s[0] désigne le même objet que t[0] (même identifiant) mais
le code s[0] = [666, 42, 777]
crée un nouvel objet liste.
Exercice 4☘
Quel affichage obtient-on avec:
1 2 3 4 5 6 7 8 9 10 11 12 | t = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] s = t s[0] = [666, 42, 777] print(t) print(s) |
Solution
On obtient:
1 2 | [[666, 42, 777], [4, 5, 6], [7, 8, 9]] [[666, 42, 777], [4, 5, 6], [7, 8, 9]] |
En effet, on a défini s comme étant le même objet que t (s = t
), une modification en place
de son premier élément concerne donc t.