Maison >développement back-end >Tutoriel Python >Pourquoi plusieurs objets Python sans nom partagent-ils parfois le même identifiant ?

Pourquoi plusieurs objets Python sans nom partagent-ils parfois le même identifiant ?

DDD
DDDoriginal
2024-12-15 03:12:14374parcourir

Why Do Multiple Unnamed Python Objects Sometimes Share the Same ID?

Identité d'objet en Python : pourquoi plusieurs objets sans nom partagent le même ID

Lors de la création de plusieurs objets d'une classe donnée en Python, on peut attendez-vous à ce que chaque instance possède une identité (ID) unique. Cependant, dans certaines circonstances, les créations successives d'objets sans nom peuvent avoir pour résultat qu'ils aient le même ID.

Comprendre la durée de vie et l'ID d'un objet

L'ID d'un objet représente son emplacement unique dans la mémoire. Cependant, cet ID est garanti unique uniquement pendant la durée de vie de l'objet, et non pendant l'exécution du programme.

Dans l'exemple fourni, vous créez deux instances sans nom de la classe someClass à l'aide de print :

print(someClass())
print(someClass())

Une fois l'impression renvoyée, les objets créés ne sont plus référencés par aucune variable et sont éligibles au garbage collection. Dans l'implémentation CPython de Python, ils sont effectivement libérés immédiatement.

Détails de l'implémentation CPython

Le garbage collection de Python s'effectue via le comptage de références. De plus, l'ID d'un objet est lié à son emplacement mémoire. Lorsque le premier objet sans nom est libéré, l'emplacement mémoire qu'il occupait devient disponible.

Par conséquent, le prochain objet créé est placé dans le même emplacement mémoire, ce qui entraîne l'attribution du même ID aux deux objets.

Solution

Pour garantir des identifiants distincts pour les objets, envisagez de conserver les références à ceux-ci dans une liste ou d'implémenter un identifiant spécifique à la classe. ID qui offre des garanties appropriées, telles que :

class SomeClass:
    next_id = 0

    def __init__(self):
         self.id = SomeClass.nextid
         SomeClass.nextid += 1

En implémentant votre propre générateur d'ID, vous pouvez créer des identifiants uniques pour chaque objet, quelle que soit sa durée de vie.

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