Maison  >  Article  >  développement back-end  >  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 ?

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 ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-31 00:33:03775parcourir

Why can two distinct objects in CPython have the same ID even though they are not the same object?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn