Pourquoi `id({}) == id({})` et `id([]) == id([])` renvoient True dans CPython ?

Mary-Kate Olsen
Libérer: 2024-10-30 04:11:03
original
272 Les gens l'ont consulté

Why do `id({}) == id({})` and `id([]) == id([])` return True in CPython?

Identifiants d'objet uniques dans CPython : pourquoi id({}) == id({}) et id([]) == id([])

La fonction id() de CPython attribue des identifiants uniques aux objets, mais ce caractère unique est limité à la durée de vie de l'objet. Lorsque des objets sont détruits, leurs identifiants deviennent disponibles pour être réutilisés.

Considérez le comportement suivant :

<code class="python">tuple1 = ()
tuple2 = ()                                                                                                   
dict1 = {}
dict2 = {}
list1 = []
list2 = []
# makes sense, tuples are immutable
assert(id(tuple1) == id(tuple2))
# also makes sense dicts are mutable
assert(id(dict1) != id(dict2))
# lists are mutable too
assert(id(list1) != id(list2))
assert(id(()) == id(()))
# why no assertion error on this?
assert(id({}) == id({}))
# or this?
assert(id([]) == id([]))</code>
Copier après la connexion

Pourquoi id({}) == id({}) et id([ ]) == id([]) return True?

Allocation de mémoire de CPython

Ces assertions réussissent grâce au mécanisme d'allocation de mémoire de CPython. Lorsque id({}), CPython alloue un dictionnaire, transmet son adresse mémoire à id(), puis supprime le dictionnaire. Lorsqu'il est à nouveau appelé, CPython trouve un bloc de mémoire libre et réutilise la même adresse. La mutabilité n'affecte pas directement ce comportement.

Mise en cache des objets de code

Les objets de code mettent en cache les tuples et les chaînes utilisés dans une fonction, une classe ou un module spécifique. Si le même littéral (entier, chaîne ou certain tuple) apparaît plusieurs fois, le même objet est réutilisé. Les objets mutables sont toujours créés au moment de l'exécution, empêchant leur réutilisation.

Conclusion

Par conséquent, l'identifiant d'un objet dans CPython n'est unique que pendant sa durée de vie. Une fois qu'un objet est détruit, son identifiant peut être réutilisé par d'autres objets. Cela explique le comportement observé dans l'extrait de code fourni.

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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!