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

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

Barbara Streisand
Libérer: 2024-12-21 20:12:39
original
406 Les gens l'ont consulté

Why Do Multiple Python Objects Sometimes Share the Same ID?

Même ID pour plusieurs objets : le comportement bizarre de Python

En Python, créer plusieurs objets sans leur attribuer de nom peut en effet les amener à partager le même identifiant. Cet apparent paradoxe vient du fait que l'ID d'un objet n'est unique que pendant sa durée de vie.

Lorsque vous créez une variable qui fait référence à un objet, comme someClass(), la durée de vie de l'objet commence lorsque la variable est attribué et se termine lorsqu'il est hors de portée. Dans l'exemple que vous avez fourni :

1

2

print(someClass())

print(someClass())

Copier après la connexion

Les deux appels someClass() génèrent deux objets, mais ils sont tous deux créés et détruits dans le même appel à print. Par conséquent, ils partagent la même durée de vie et peuvent avoir le même identifiant.

Ce comportement est encore accentué dans l'utilisation par Python 3.3.3 du comptage de références pour le garbage collection. Lorsque le nombre de références d'un objet atteint zéro (c'est-à-dire qu'aucune variable ne s'y réfère), il devient éligible à la suppression. Dans notre exemple, le deuxième appel à someClass() fait atteindre zéro le nombre de références du premier objet, le rendant éligible à une désallocation immédiate.

Puisque le prochain objet à allouer est placé dans le même emplacement mémoire en tant que premier objet, il se retrouve avec le même identifiant. Cela explique pourquoi l'appel de la même classe plusieurs fois de suite peut donner lieu à des objets avec le même ID.

Si vous avez besoin d'ID uniques pour les objets, vous pouvez surmonter ce problème en les attribuant explicitement à des variables et en les conservant. :

1

2

3

4

a = someClass()

b = someClass()

print(id(a))

print(id(b))

Copier après la connexion

Ici, a et b font référence à des objets distincts avec des identifiants distincts, même s'ils appartiennent à la même classe. Alternativement, vous pouvez implémenter votre propre mécanisme d'identification spécifique à la classe pour garantir l'unicité.

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 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