* candide, on 30.05.2010 19:38:
Suppose a Python program defines an integer object with value 42. The
object has an "address" we can capture with the built-in function id() :
>>> a=42
>>> id(a)
152263540
>>>
Now I was wondering if any integer object with value 42 will be refered
at the same adress with the above id.
Some experiments tend to show that it may be the case, for instance :
>>> a=42
>>> id(a)
152263540
>>> id(42)
152263540
>>> b=2*21
>>> id(b)
152263540
>>> c=0b101010
>>> id(c)
152263540
>>> d={"foo":42, "bar":"foo"}
>>> id(d["foo"])
152263540
>>> L=["foo",(51,([14,42],5)),"bar"]
>>> id(L[1][1][0][1])
152263540
>>> del a
>>> id(L[1][1][0][1])
152263540
>>> zzz=range(1000)
>>> id(zzz[42])
152263540
>>>
Even you can't make a deep copy :
>>> from copy import deepcopy
>>> a=42
>>> from copy import deepcopy
>>> z=deepcopy(a)
>>> id(a), id(z)
(152263540, 152263540)
>>>
So is the following true :
Two non mutable objects with the same value shall be allocated at a
constant and unique address ?
No.
First, id() doesn't generally provide an address. It does that in CPython, but
more generally it just provides a unique integer identifying the reference. You
can think of it as the "reference value" if you want; it's what's copied by an
assignment to a variable.
Second, the reason that you get the same id for various 42 objects is that
CPython uses a cache of "small integer" objects. As I recall the cache ranges
from -5 to some 127 or so (or perhaps it was double that). Any value outside
that cached range you'll see different id's for the same value.
Cheers & hth.,
- Alf
--
blog at <url: http://alfps.wordpress.com>
--
http://mail.python.org/mailman/listinfo/python-list