You are seeing the results of a CPython optimisation called small integer cache.
CPython stores integers between -5 and 256 (inclusive) in a special cache as they are frequently used in user programs. This way the interpreter doesn't have to initialise a new object every time you use a number:
>>> x = 10
>>> y = 10
>>> id(x) == id(y)
True
while
>>> x = 1000
>>> y = 1000
>>> id(x) == id(y)
False
Now, assume that the small integer cache looks like this in memory:
[-5, -4, -3, ... , 10, ... 20, ..., 256]
Small integers normally take 28 bytes in Python 3, but probably because of some 4 byte overhead, each number above takes up exactly 32 bytes:
>>> id(1) - id(0)
32
When you do
>>> x = 10
>>> y = 20
You actually assign memory locations of 10
and 20
in the small integer cache to the variables x
and y
, respectively. That's why you are seeing a difference of 320 bytes (32 * 10) between them.
Note that this behaviour is only guaranteed for CPython. Other Python interpreters may not have a small integer cache, or they might implement the id()
function differently.