Все в Python - это объект. Таким образом, размер int в Python будет больше обычного.
>>> sys.getsizeof(int())
24
Хорошо, но почему требуется еще 2 байта для 2⁶³
по сравнению с 2⁶³ - 1
а не только один?
>>> sys.getsizeof(2**63)
36
>>> sys.getsizeof(2**62)
24
Я получаю, что 2⁶³
- это длинный и 2⁶³-1
int, но почему 12 байтов разницы?
Не более интуитивно, я пробовал некоторые другие вещи:
>>> a = 2**63
>>> a -= 2**62
>>> sys.getsizeof(a)
36
a
по-прежнему сохраняется как длинный, даже если он может быть в int сейчас. Так что неудивительно. Но:
>>> a -= (2**63 - 1)
>>> a = 2**63
>>> a -= (2**63 - 1)
>>> a
1L
>>> sys.getsizeof(a)
28
Новый размер.
>>> a = 2**63
>>> a -= 2**63
>>> a
0L
>>> sys.getsizeof(a)
24
Возврат к 24 байтам, но с длинным.
Последнее, что я получил:
>>> sys.getsizeof(long())
24
Вопрос:
Как память хранится в этих сценариях?
Суб-вопросы:
Почему существует пробел в 12 байт, чтобы добавить то, что говорит нам наша интуиция, всего лишь 1 бит?
Почему int()
и long()
24 байта, но long(1)
уже 28 байтов и int(2⁶²)
?
NB: Python 3.X работает немного по-другому, но не более интуитивно. Здесь я сосредоточился на Python 2.7; Я не тестировал предыдущие версии.