strange comparison result with 'is'

Terry Reedy tjreedy at udel.edu
Mon Oct 17 13:53:13 EDT 2011


On 10/17/2011 5:19 AM, Peter Otten wrote:

> The getattr() call is just a distraction. Every x.pop attribute access
> creates a new method object. In the case of
>
>>>> x.pop is x.pop
> False
>
> they have to reside in memory simultaneously while in the expression
>
>>>> id(x.pop) == id(x.pop)
> True
>
> a list.pop method object is created, its id() is taken (which is actually
> its address) and then the method object is released so that its memory
> address can be reused for the second x.pop.
>
> So in the latter case the two method objects can (and do) share the same
> address because they don't need to exist at the same time.

This has come up enough that I opened
http://bugs.python.org/issue13203
==============================================================
Newbies too often do something like (3.2.2, )

 >>> id(getattr(x, 'pop')) == id(x.pop)
True

and get confused by the (invalid) result, whereas

 >>> a,b=getattr(x, 'pop'),x.pop
 >>> id(a)==id(b)
False

works properly. I think we should add a sentence or two or three to the 
id() doc, such as

Since a newly created argument object is either destroyed or becomes 
inaccessible before the function returns, *id(obj)* is only useful and 
valid if *obj* exists prior to the call and therefore after its return.
The value of an expression such as *id(666)== id(667)* is arbitrary and 
meaningless. The id of the first int object might or might not be reused 
for the second one.
====================================================================

With something like this added, we could just say 'read the id() doc'.

-- 
Terry Jan Reedy




More information about the Python-list mailing list