identifying objects, why does the returned value from id(...) change?
Because integers are immutable, each integer value is a distinct object with a unique id. The integer 10
has a different id from 11
. Doing j=j+1
doesn't change the value of an existing integer object, rather it changes j
to point to the object for 11
.
Check out what happens when we independently create a new variable k
and assign it the value 11
:
>>> j=10
>>> id(j)
8402204
>>> j=j+1
>>> id(j)
8402192
>>> k=11
>>> id(k)
8402192
Note that it is not always the case that every integer has one and only one corresponding object. This only happens for small integers that Python decides to cache. It does not happen for large integers:
>>> x = 123456789
>>> id(x)
8404568
>>> y = 123456789
>>> id(y)
8404604
See https://docs.python.org/3/c-api/long.html#c.PyLong_FromLong:
The current implementation keeps an array of integer objects for all integers between -5 and 256, when you create an int in that range you actually just get back a reference to the existing object.
This is why 2**8 is 2**8 == True
, and 2**9 is 2**9 == False
.
Values between -5 and 256 are preallocated.