Les Crash-Devs d'un Passionné

Manipuler des objects mutables comme une liste

/Catégorie/python

Temps de lecture : 1 minutes

Il existe 2 catégories de structure,

  • les objets mutables, dont la référence est constante comme une liste
  • les objets immutables, dont la référence est mise à jour lors d'une modification comme une str

Une référence est l'emplacement mémoire choisie par l'interpréteur python pour stocker en mémoire cette structure

clipboard
Copier le code
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
>>> immuable_object = [1, 2, 3]
>>> id (immuable_object)
124466641095488
>>> immuable_object.append(4)
>>> id (immuable_object)
124466641095488

>>> muable_object = "Hello"
>>> id (muable_object)
124466629020336
>>> muable_object += ", world"
>>> id (muable_object)
124466629092848

Nous allons parler des objets immuables et plus particulièrement des listes.

Lorsque vous avez une liste et que vous voulez en faire une copie on pourrait vouloir faire

clipboard
Copier le code
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
>>> wrong_copy_immuable_object = immuable_object
>>> id(wrong_copy_immuable_object)
124466641097216
>>> wrong_copy_immuable_object
[1, 2, 3]
>>> immuable_object
[1, 2, 3]
>>> wrong_copy_immuable_object.append(4)
>>> wrong_copy_immuable_object, immuable_object # 2 objects updated !
([1, 2, 3, 4], [1, 2, 3, 4])

Là on se rend compte que les 2 listes sont mises à jour. En effet l'instruction d'affectation ne fait que copier une nouvelle référence qui pointe sur la liste d'origine.

Lorsque vous avez une liste et que vous souhaitez faire une manipulation de cette structure tout en conservant sa référence vous devez utiliser une shallow copy

.copy()

clipboard
Copier le code
1
2
3
4
5
6
7
8
9
>>> copy_immuable_object = immuable_object.copy()
>>> id(copy_immuable_object)
124466641095488
>>> copy_immuable_object = ["a", "b", "c"]
>>> id(copy_immuable_object)
124466627372352
>>> copy_immuable_object.append("d")
>>> copy_immuable_object, immuable_object
(['a', 'b', 'c', 'd'], [1, 2, 3, 4])

Et si maintenant vous avez envie de modifier l'intégralité de votre liste pour la trier par exemple vous allez utiliser un slice

[:]

clipboard
Copier le code
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
>>> immuable_object = [1, 2, 3, 4]
>>> id(immuable_object)
124466628790528
>>> immuable_object[:] = [4, 3, 2, 1]
>>> id(immuable_object)
124466628790528
>>> immuable_object
[4, 3, 2, 1]
>>> immuable_object = [4, 3, 2, 1] # Not a shallow copy, creating new reference
>>> id(immuable_object)
124466627560640

Et voilà avec ces quelques opérateurs vous maitriserez mieux vos listes