Maison >développement back-end >Tutoriel Python >Pourquoi plusieurs objets Python sans nom partagent-ils parfois le même identifiant ?
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!