Maison >développement back-end >Tutoriel Python >Pourquoi `id({}) == id({})` et `id([]) == id([])` renvoient True dans CPython ?

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

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-30 04:11:03361parcourir

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>

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!

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