Почему такое распределение бит в памяти?

Почему такое распределение бит в памяти?

x = 3
y = 7
print(id(3))
print(id(7))

получается

1362879447344

1362879447472

Почему такое распределение как будто оно сразу для 4 5 6 выделило память?


Ответы (2 шт):

Автор решения: Сергей Островский

Узнать id объекта в памяти:

id('Значение')

Узнать сколько занимает памяти:

import sys

print(sys.getsizeof('Значение'))

Функция id() возвращает уникальный идентификатор для указанного объекта. Все объекты в Python имеют свой уникальный идентификатор. Идентификатор присваивается объекту при его создании. Идентификатор является адресом памяти объекта и будет отличаться при каждом запуске программы.

Более подробно изложено тут https://pythobyte.com/id-function-in-python-62441/

→ Ссылка
Автор решения: Stanislav Volodarskiy

Распределение такое потому что оно действительно выделило память для 4, 5 и 6 заранее.

Питон кеширует маленькие целые числа чтобы в вычислениях они занимали меньше места. Числа в Питоне - объекты, каждая арифметическая операция порождает новый объект. За одним исключением: если число мало, то это будет проверено и вместо создания нового объекта будет взят объект из кеша. Кеш заполняется на старте интерпретатора.

Документация. Исходный код.

Оба выражения равны десять. У них одинаковые id, так как десятка в кеше:

@>>> id(9 + 1)
140364789449232
@>>> id(11 - 1)
140364789449232

Оба выражения равны тысяче. У них разные id, так как тысячи в кеше нет. Каждая новая вычисленная тысяча - новый объект:

@>>> id(1001 - 1)
140364769497712
@>>> id(999 + 1)
140364769498320

Ещё одна демонстрация:

ids1 = {i: id(i) for i in range(-1000, 1001)}
ids2 = {i: id(i) for i in range(-1000, 1001)}

for n in (-6, -5, 256, 257):
    print(n, ids1[n] == ids2[n])
$ python in_cache.py
-6 False
-5 True
256 True
257 False
→ Ссылка