То же значение для 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