En Python, chaque objet, que ce soit un nombre, une liste, une instance de classe, possède une "identité" unique durant son cycle de vie.
Pour connaître l'identité d'un objet, il est possible d'utiliser la fonction id qui retourne l'identité d'un objet sous forme d'entier.
L'id correspond à l'adresse mémoire de cet objet.
Syntaxe
La syntaxe de id est simple :
id(objet)
Prenons un exemple simple :
a = 100000 print(id(a))
Identité vs égalité
La fonction id permet de comprendre la différence entre les opérateurs is et == :
-
L'opérateur
==compare les valeurs des objets -
L'opérateur
iscompare leurs identités.a is best une façon raccourcie de faireid(a) == id(b)
liste_a = [1, 2, 3] liste_b = [1, 2, 3] # '==' compare les valeurs -> True print(f"liste_a == liste_b: {liste_a == liste_b}") # 'is' compare si ce sont les mêmes objets en mémoire -> False print(f"liste_a is liste_b: {liste_a is liste_b}")
id avec les objets immuables
Pour des raisons d'optimisation, Python peut réutiliser des objets immuables en évitant d'en créer de nouveaux. Le cas des petits entiers (de -5 à 256 en général) est le plus connu :
x = 250 y = 250 print(f"x is y: {x is y}") # True print(f"id(x): {id(x)}") print(f"id(y): {id(y)}") # L'ID est le même
Pour les plus grands nombres, le comportement dépend du contexte d'exécution :
a = 1000 b = 1000 print(f"a is b: {a is b}") # Souvent True dans un script, False en interactif print(f"id(a): {id(a)}") print(f"id(b): {id(b)}")
Lorsque vous exécutez le script ci-dessus avec VS Code, par un mécanisme d'optimisation, a et b seront le même objet. En revanche, dans un shell Python, nous aurons deux objets différents en mémoire.
Cela s'explique par le fait que dans un script, Python peut lire l'intégralité du script avant son exécution et réaliser des opérations d'optimisation avant d'exécuter le script.
Dans un shell interactif, cette opération n'est pas possible car chaque ligne est évaluée au fur et à mesure. L'interpréteur Python ne peut donc pas deviner par avance les optimisations nécessaires.
Exemple avec VS Code
Exemple avec un shell Python
id avec les objets muables
Pour les objets muables comme les listes ou les dictionnaires, une nouvelle instance est créée à chaque fois, même en cas de contenu identique.
L'id ne change pas tant que l'objet n'est pas réassigné et modifier l'objet ne change pas son identité :
ma_liste = [10, 20] print(f"ID initial : {id(ma_liste)}") # On modifie la liste en place ma_liste.append(30) print(f"ID après append : {id(ma_liste)}") # L'ID est identique # L'id est différent, même si le même nom est utilisé, car nous faisons une assignation # On ne modifie donc pas l'objet directement comme avec append, on en crée un nouveau ma_liste = [10, 20, 30] print(f"ID après réassignation : {id(ma_liste)}") # L'ID est différent
id est souvent utilisé pour le débogage et permet de mieux comprendre les concepts de mutabilité/immutabilité et la différence entre is et ==.