Maison >développement back-end >Tutoriel Python >Pourquoi `id({}) == id({})` et `id([]) == id([])` renvoient True dans CPython ?
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!