Python può riutilizzare le posizioni di memoria.
Quando si esegue:
id(1.1)
si crea un valore float, per chiedere la sua id()
, e poi Python cancella di nuovo il valore perché nulla si riferisce ad esso. Quando quindi si crea un altro valore float, Python può riutilizzare la stessa posizione di memoria e quindi id(2.2)
è probabile che torni lo stesso valore per id()
:
>>> id(1.1)
140550721129024
>>> id(2.2)
140550721129024
fare questo, invece:
float_one, float_two = 1.1, 2.2
print id(float_one), id(float_two)
Ora la i valori float hanno riferimenti a loro (le due variabili) e non verranno distrutti e ora hanno diverse posizioni di memoria e quindi valori id()
.
La ragione per cui si visualizzano diversi valori id()
per numeri interi piccoli (da -5 a 256) è perché these values are interned; Python crea solo uno1
oggetto intero e lo riutilizza più e più volte. Di conseguenza, questi numeri interi hanno tutti un aspetto di memoria univoco, poiché l'interprete Python stesso si riferisce a loro e non li cancellerà fino a quando l'interprete non si chiude.
fonte
2013-06-16 09:57:13
Ah, sì, ero in ipython dove i numeri sono memorizzati in Out! :) –
Grazie a @MartijnPieters. – ehsandotnet
Si noti che questo internamento dei piccoli numeri interi è probabilmente una caratteristica dell'implementazione di CPython piuttosto che una proprietà garantita del linguaggio. In questo caso, è simile ai valori NSInteger di piccole dimensioni (da 0 a 12 dalla memoria) in alcune implementazioni Objective-C in cui le persone si sono interrogate sullo strano numero di trattini. E, così, probabilmente non è una buona idea affidarsi a questo internamento. – paxdiablo