Skip to content

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.