То же значение для id (float)

Насколько я знаю, все объекты в Python, а id() должен (я прав?) возвращает другое число для каждого объекта.

В моем случае id(1) возвращает 4298178968, id(2) возвращает 4298178944, но я получаю одинаковые значения для всех типов float, id(1.1) возвращает 4298189032, id(2.2) также возвращает 4298189032 и больше.

Почему я получаю одинаковый id для всех значений float?

Ответ 1

Python может повторно использовать позиции памяти.

При запуске:

id(1.1)

вы создаете значение float, запрашиваете его id(), а затем Python снова удаляет значение, потому что ничего не ссылается на него. Когда вы затем создаете другое значение float, Python может повторно использовать одну и ту же позицию памяти и, следовательно, id(2.2), скорее всего, вернет то же значение для id():

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

Сделайте это вместо:

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

Теперь значения float имеют ссылки на них (две переменные) и не будут уничтожены, и теперь они имеют разные позиции памяти и, следовательно, значения id().

Причина, по которой вы видите разные значения id() для малых целых чисел (от -5 до 256), состоит в том, что эти значения интернированы; Python создает только один объект 1 integer и повторно использует его снова и снова. В результате эти целые числа имеют уникальный адрес памяти, так как сам интерпретатор Python уже ссылается на них и не удаляет их до тех пор, пока интерпретатор не выйдет.

Ответ 2

>>> id(1.1)
154154684

Поскольку 1.1 не было присвоено какой-либо переменной, поэтому он собирает мусор, и в следующий раз тот же самый идентификатор будет использоваться для float:

>>> id(2.2) 
154154684

сохранить 1.1 в переменной:

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

Теперь используется новый адрес:

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

Это относится к целям:

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

Целые числа от -5 до 256 на самом деле кэшируются в python, поэтому они всегда будут возвращать разные идентификаторы. ( "is" оператор ведет себя неожиданно с целыми числами)

Для строк:

Как и целые числа, некоторые строки также кэшируются в python. Таким образом, id таких строк будет отличаться (подробнее см.: Оператор 'is' ведет себя по-разному при сравнении строк с пробелами:

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

Не-буквенно-цифровая строка (использует те же id):

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