Question Même valeur pour id (float)


Pour autant que je sache, tout est objet en Python et le id () devrais-je (ai-je raison?) renvoyer un nombre différent pour chaque objet.

Dans mon cas, id(1) résultats 4298178968, id(2) résultats 4298178944 mais j'obtiens les mêmes valeurs pour tous les types de flotteurs, id(1.1) résultats 4298189032, id(2.2) retourne aussi 4298189032 et plus.

Pourquoi je reçois le même id pour toutes les valeurs flottantes?


13
2018-06-16 09:55


origine


Réponses:


Python peut réutiliser les positions de mémoire.

Lorsque vous courez:

id(1.1)

vous créez une valeur flottante, demandez son id(), puis Python supprime la valeur à nouveau parce que rien n'y fait référence. Lorsque vous créez ensuite un autre float value, Python peut réutiliser la même position de mémoire et donc id(2.2) est susceptible de renvoyer la même valeur pour id():

>>> id(1.1)
140550721129024
>>> id(2.2)
140550721129024

Faites ceci à la place:

float_one, float_two = 1.1, 2.2
print id(float_one), id(float_two)

Maintenant, les valeurs flottantes ont des références à elles (les deux variables) et ne seront pas détruites, et elles ont maintenant des positions de mémoire différentes et donc id() valeurs.

La raison pour laquelle tu vois différent id() valeurs pour les petits entiers (de -5 à 256) est parce que ces valeurs sont internées; Python ne crée que un  1 objet entier et le réutilise encore et encore. Par conséquent, ces entiers ont tous une adresse mémoire unique, car l'interpréteur Python lui-même y fait déjà référence et ne les supprimera pas avant la fermeture de l'interpréteur.


18
2018-06-16 09:57



>>> id(1.1)
154154684

Comme la version 1.1 n'a été assignée à aucune variable, elle est récupérée et la prochaine fois, le même identifiant sera utilisé pour un flottant:

>>> id(2.2) 
154154684

enregistrer 1.1 dans une variable:

>>> f = 1.1
>>> id(f)
154154684  #this id is locked for now

Maintenant, une nouvelle adresse est utilisée:

>>> id(1.1)
154154700
>>> id(2.2)
154154700

Ceci s'applique à entiers ainsi que:

>>> id(260)
154302180
>>> id(280)
154302180

Entiers de -5 à 256 sont en fait mis en cache en python, donc ils vont toujours retourner des identifiants différents. L'opérateur "is" se comporte de manière inattendue avec des entiers )

Pour cordes:

Comme les entiers, certaines chaînes sont également mises en cache dans python. Alors, id de telles chaînes va être différent (Pour plus de détails, lisez: L'opérateur 'is' se comporte différemment lors de la comparaison de chaînes avec des espaces ):

>>> id('foo')
162861592
>>> id('foo')
162861568

Chaîne non alphanumérique (utilise le même id):

>>> id('foo!&9((&')
162840000
>>> id('foo!&9((&')
162840000

4
2018-06-16 10:00