Séquences mutables ou non

Rappelons que quand on crée une variable, donc lorsqu’on lie un identificateur à un objet par l’instruction nom=obj, on associe en fait à cet identificateur l’adresse en mémoire où se trouve physiquement l’objet. On exprime cette situation en disant qu’on crée une référence, ou encore un pointeur, vers l’objet.

Il y a une différence importante entre les listes d’une part, et les chaînes et tuples de l’autre : les listes sont dites mutables, mais les chaînes et les tuples ne le sont pas.

Dire qu’un objet est mutable, c’est dire qu’on peut en modifier (voire en supprimer) un (ou plusieurs) élément(s), sans pour autant créer une nouvelle référence vers l’objet ainsi modifié (l’adresse du début de l’objet reste inchangée).

Par exemple, si on pose x = y = [5, 2, 9], on définit deux variables x et y contenant en fait l’adresse d’une unique liste. On peut poser x[1] = 10 : on mute donc la liste dont le contenu est maintenant [5, 10, 9], mais dont l’adresse ne change pas en mémoire. Les variables x et y pointent donc toujours vers la même adresse, à laquelle on trouve la liste [5, 10, 9] (pour l’utilisateur, tout se passe donc comme si la mutation de la liste x s’était répercutée sur la liste y).

Le caractère mutable des listes peut réserver quelques surprises. Considérons l’exemple suivant :

Reprenons l’exemple précédent, en le modifiant légèrement :

Dans l’exemple suivant, on place dans la variable z une liste contenant quatre exemplaires de la liste [1, 2, 3].

Dans un premier temps, on redéfinit l’élément z[0]. Cela n’a pas d’impact sur z[1], z[2] et z[3].

Mais si on mute l’élément z[1], par exemple, cette mutation se répercute sur les éléments z[2] et z[3] (car z[1], z[2] et z[3] continuent à pointer sur la même adresse).

Retour à l’accueil du cours Python/Numpy

Sommaire du chapitre 5

  1. Propriétés communes aux séquences (hors “mutations”)
  2. Séquences mutables ou non
  3. Listes définies “en compréhension”
  4. Opérations de mutation de listes
  5. Les tuples
  6. Les chaînes de caractères
  7. Méthodes importantes sur les chaînes (split, join, format)
  8. Objets de type bytes et bytearray