Skip to content

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
on fera attention au fait que l'usage de méthode modifiant b sur place modifie également a (par exemple, utilisation sur une liste de .append, de .sort...)

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).