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
Libérer: 2024-10-31 00:33:03
original
857 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal