Muable, immuable☘
Certains objets python sont muables (modifiables), d'autres ne le sont pas...
Info
Le mot anglais utilisé dans la documentation python est mutable/immutable. La traduction française utilisée dans cette documentation python est muable/immuable (de muer). On aurait pu choisir une traduction telle que modifiable/non-modifiable, ou encore transformable/non-transformable. L'important est de comprendre ce que cela signifie (voir les explications ci-dessous).
Info
En NSI, on retiendra:
muable | immuable |
---|---|
list | int |
dict | float |
bool | |
tuple | |
str |
Exemple d'objet muable☘
Une liste est un objet muable: elle possède un contenu (ses éléments) et ce contenu peut-être modifié à l'aide de méthodes de l'objet.
Dans l'exemple ci-dessous par exemple, on modifie un élément de la liste t. On constate que l'identifiant de la liste est resté le même après cette modification.
1 2 3 4 5 6 7 8 | >>> t = [6, 7, 9, 12] >>> id(t) 140209083016520 >>> t[3] = 345 >>> t [6, 7, 9, 345] >>> id(t) 140209083016520 |
Note
Lorsqu'on modifiera un objet muable sans créer un nouvel objet, on dira que l'on modifie l'objet "sur place" (ou "en place"). Par exemple, on pourra trier une liste "sur place": on trie le contenu de la liste mais sans créer de nouvelle liste, la liste reste le même objet, au même emplacement mémoire mais avec un contenu modifié.
Objet muable avec plusieurs étiquettes☘
Une conséquence importante du caractère muable est illustrée ci-dessous:
1 2 3 4 5 6 7 | >>> t = [8, 2, 9, 3] >>> s = t >>> s[0] = 42 >>> s [42, 2, 9, 3] >>> t [42, 2, 9, 3] |
s et t désignent le même objet
toute transformation de l'objet s transforme aussi l'objet t puisqu'il s'agit du même objet.
De la même façon, on peut ajouter un élément à une liste sans créer une nouvelle liste:
1 2 3 4 5 6 7 8 | >>> t = [41, 42, 43] >>> id(t) 140070706292808 >>> t.append(44) >>> t [41, 42, 43, 44] >>> id(t) 140070706292808 |
L'identifiant est le même, il s'agit du même objet (mais avec un contenu modifié).
Objet immuable☘
Les objets de type int, de type float, de type str, de type tuple sont tous immuables. Il n'est donc pas possible de les modifier sans créer un nouvel objet.
Exemple: objet de type str☘
Si l'on veut par exemple, ajouter une lettre à une chaîne de caractères:
1 2 3 4 5 6 7 8 | >>> chaine = "méduse" >>> id(chaine) 140070726714032 >>> chaine = chaine + 'r' >>> chaine 'méduser' >>> id(chaine) 140070706374736 |
on constate que l'identifiant n'est plus le même: on a créé un nouvel objet. Le nouvel objet a récupéré l'étiquette de l'ancien objet (l'ancien objet n'a donc ici plus d'étiquette).
Après la ligne 1:
Après la ligne 4:
Exemple avec un objet muable☘
Il faut noter que si l'on n'utilise pas une méthode de modification de l'objet "sur place" pour un objet muable, on peut avoir le même effet (création d'un nouvel objet). Nous avons vu par exemple ci-dessus comment ajouter un élément à une liste sans créer un nouvel objet liste. A comparer avec ce qui suit:
1 2 3 4 5 6 7 8 | >>> t = [ 100, 200, 300] >>> id(t) 140070726804808 >>> t = t + [400] >>> t [100, 200, 300, 400] >>> id(t) 140070706292744 |
Après la ligne 1:
Après la ligne 4:
L'étiquette t, après la ligne 4, ne désigne pas le même objet qu'après la ligne 1.
Exemple avec un objet de type int☘
1 2 3 4 5 6 7 8 | >>> a = 2 >>> id(a) 94456221127584 >>> a = a+2 >>> a 4 >>> id(a) 94456221127648 |
On constate là encore que l'étiquette a ne désigne plus le même objet après une nouvelle affectation.
Important
Pour résumer, on retiendra que toute affectation a = valeur
crée un nouvel objet,
tandis qu'une affectation b = a
où a est déjà un nom de variable (une étiquette) donne une seconde
étiquette sur un objet existant.
Important
Pour un objet muable (en première NSI: les listes et les dictionnaires), après le code:
1 2 | a = valeur d'un muable b = a |
Par contre, pour un objet immuable (int, float, str, tuple, bool) , après le code
1 2 | a = valeur d'un immuable b = a |
b désigne le même objet que a, mais cela n'a pas vraiment d'importance: toute transformation de b n'a aucune influence sur a (puisqu'une transformation de b crée nécessairement un nouvel objet).