Определение объектов, почему возвращается возвращаемое значение из id (...)?
идентификатор (объект)
Это целое число (или длинное целое число), которое гарантировано является уникальным и постоянным для этого объекта в течение его жизни.
Можете ли вы объяснить этот вывод? Почему изменяется идентификатор j
?
>>> i=10
>>> id(i)
6337824
>>> j=10
>>> id(j)
6337824
>>> j=j+1
>>> id(j)
6337800
>>> id(i)
6337824
Ответы
Ответ 1
Поскольку целые числа неизменяемы, каждое целочисленное значение представляет собой отдельный объект с уникальным идентификатором. Целое число 10
имеет другой идентификатор от 11
. Выполнение j=j+1
не изменяет значение существующего целочисленного объекта, вместо этого оно изменяет j
, чтобы указать на объект для 11
.
Проверьте, что происходит, когда мы самостоятельно создаем новую переменную k
и присваиваем ей значение 11
:
>>> j=10
>>> id(j)
8402204
>>> j=j+1
>>> id(j)
8402192
>>> k=11
>>> id(k)
8402192
Обратите внимание, что не всегда бывает, что каждое целое число имеет один и только один соответствующий объект. Это происходит только для небольших целых чисел, которые Python решает кэшировать. Это не происходит для больших целых чисел:
>>> x = 123456789
>>> id(x)
8404568
>>> y = 123456789
>>> id(y)
8404604
См. https://docs.python.org/3/c-api/long.html#c.PyLong_FromLong:
Текущая реализация сохраняет массив целочисленных объектов для всех целых чисел от -5 до 256, когда вы создаете int в этом диапазоне, вы фактически просто возвращаете ссылку на существующий объект.
Ответ 2
Вот почему 2**8 is 2**8 == True
и 2**9 is 2**9 == False
.
Значения между -5 и 256 предварительно распределены.
Ответ 3
Тот же id
для разных переменных является продуктом того, как Python создает переменные.
id
является хешем местоположения объекта в памяти. Переменные Python - это ссылки на объект, а не на новые объекты. Если несколько переменных ссылаются на один и тот же объект, они имеют одинаковый идентификатор.
Ответ 4
В CPython id
обычно выводится из значения указателя Py_Object
, то есть его местоположения в памяти.
Ответ 5
Python кэширует неизменяемые объекты (читай целые числа и кортежи..) - вот почему они неизменяемы
и сохраняет память, если u ссылается на то же неизменяемое во многих
мест. Итак, small
целые числа, пустые кортежи и т.д. На самом деле
кэшируется в среде исполнения Python, поэтому вы продолжаете возвращать один и тот же объект
и, следовательно, один и тот же идентификатор.
Попробуйте это для списка, вы не получите тот же идентификатор.
Ответ 6
Это примитивные типы, поэтому я предполагаю, что каждое значение получает свой собственный идентификатор. Попробуйте создать истинный объект, и я думаю, вы увидите функциональность, которую вы ожидаете.
Если вам нужен идентификатор для примитива, вы можете создать объект с одним членом этого типа.
Ответ 7
j
Идентификатор изменяется, поскольку изменяется объект, названный j
. Сначала вы инициализируете j
до 10, поэтому, когда вы вызываете id(j)
, вы получаете идентификатор 10
. Затем вы устанавливаете j
в 11, поэтому после этого, когда вы вызываете id(j)
, вы получаете идентификатор 11
.