Maison >développement back-end >Tutoriel Python >Pourquoi deux objets distincts dans CPython peuvent-ils avoir le même ID même s'il ne s'agit pas du même objet ?
Comprendre les ID d'objet identiques dans CPython
Dans CPython, la fonction intégrée id() renvoie un entier unique représentant l'adresse mémoire de l'objet . Curieusement, dans certaines circonstances, deux objets distincts peuvent avoir le même identifiant, comme observé dans l'exemple suivant :
<code class="python">tuple1 = () tuple2 = () dict1 = {} dict2 = {} list1 = [] list2 = [] # Tuples are immutable assert(id(tuple1) == id(tuple2)) # Dicts are mutable assert(id(dict1) != id(dict2)) # Lists are mutable too assert(id(list1) != id(list2)) # Unexpectedly, empty dicts and lists have the same ID assert(id({}) == id({})) assert(id([]) == id([]))</code>
La raison derrière le comportement
Cette particularité Ce phénomène se produit en raison du comportement d'exécution de l'allocateur de mémoire de CPython et de la façon dont il gère la création et la destruction d'objets. Lorsque id({}) est appelé, CPython crée un nouvel objet dictionnaire et l'assigne à un emplacement temporaire en mémoire. Cependant, cet objet temporaire est détruit immédiatement après que son identifiant soit renvoyé par la fonction id(). Lorsque le prochain id({}) est appelé, le nouveau dictionnaire peut être créé dans le même emplacement mémoire que le précédent, ce qui donne le même ID même si ces objets sont distincts.
Ce raisonnement est renforcé par le comportement observé dans la séquence suivante :
<code class="python">id([]) 4330909912 x = [] id(x) 4330909912 id([]) 4334243440</code>
Impact de la mutabilité et de la mise en cache
Il convient de noter que la mutabilité joue un rôle indirect dans ce comportement. Bien que les objets mutables (tels que les listes et les dictionnaires) ne soient pas éligibles pour la mise en cache des objets de code, les objets immuables (comme les tuples vides et certaines chaînes) le sont. Cela signifie qu'au sein du même objet de code, ces objets immuables seront réutilisés, conduisant potentiellement à l'attribution du même identifiant à des objets immuables distincts.
Unicité de l'identifiant et durée de vie de l'objet
En résumé, l'identifiant d'un objet n'est unique que pendant toute la durée de sa vie. Une fois qu'un objet est détruit ou avant sa création, un autre objet peut se voir attribuer le même identifiant. Ce comportement souligne la nature éphémère des ID d'objet dans CPython et l'importance de comprendre l'allocation de mémoire et la dynamique de création d'objets dans le contexte de l'implémentation Python sous-jacente.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!