Подтвердить что ты не робот

Определение объектов, почему возвращается возвращаемое значение из id (...)?

идентификатор (объект)

Это целое число (или длинное целое число), которое гарантировано является уникальным и постоянным для этого объекта в течение его жизни.

Можете ли вы объяснить этот вывод? Почему изменяется идентификатор j?

>>> i=10  
>>> id(i)  
6337824  
>>> j=10  
>>> id(j)  
6337824  
>>> j=j+1  
>>> id(j)  
6337800  
>>> id(i)  
6337824  
4b9b3361

Ответ 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.