id() collisions on bound methods [was: metaclass and customization with parameters]
exarkun at divmod.com
exarkun at divmod.com
Tue Oct 5 19:57:52 EDT 2004
On Tue, 5 Oct 2004 16:50:33 -0700, "Robert Brewer" <fumanchu at amor.org> wrote:
> [snip]
> >>> f = Foo()
> >>> id(f.method0)
> 18569136
> >>> id(f.method1)
> 18536648
> >>> id(f.method2)
> 18536648
> >>> id(f.method0)
> 18536648
>
> ...so the id() result is mutating somehow, even for the same object.
> This is true for both old- and new-style classes, by the way, and also
> holds for methods where you don't simply pass (I tried return 0,
> return1, and return 2, for example function bodies)
id() is only guaranteed unique *for the lifetime of the object*. As soon as the object ceases to exist, its id may appear as the id for any other object.
In the above example, this makes a lot of sense if you understand a few things:
1) instanceObj.methodAttr results in a *new* bound method object every time it is evaluated.
2) The CPython id() implementation uses the value of the pointer to a PyObject.
3) Objects of the same size/type allocates and de-allocated in rapid succession often have a fairly high chance of being allocated the same memory in CPython.
Jp
More information about the Python-list
mailing list