[Edu-sig] python versus __python__
Beni Cherniavsky
cben at users.sf.net
Wed Oct 26 01:36:01 CEST 2005
On Mon, 2005-10-24 at 20:24 -0700, Scott David Daniels wrote:
> With CPython, expressions, once used and dereferenced, recycle their
> objects. If you don't hold a reference to the value created by
> calculating the log of pi, it will get recycled once id is done
> with is arg. The available storage is lying around when log(e)
> is calculated and so is reused. Such things don't happen when
> working with small integers, because Python caches them to save
> some creation time.
>
> So,
> id(math.pi + 1.0) == id(29. / 7.)
>
> but then again:
> id(math.pi + 5280.0) == id(1. / 9.)
>
Neat :-)
Of course, the proper way to compare object identity is not the
__low_level__ `id()` function but the ``is`` operator:
>>> (math.pi + 1.0) is (29. / 7.)
False
>>> int('99') is int('99') # small integer
True
>>> int('100') is int('100') # big integer
False
[``is`` works properly because both expressions are evaluted before the
``is`` operator is evaluted and only then the 2 values are
garbage-collected. With `id()`, the 2 values could be reclaimed
immediately because only the address is needed for the ``==``
comparison. The fact that `id(foo)` does not reference `foo` is the #1
source of confusion regarding `id()`.]
More information about the Edu-sig
mailing list