Is " a is b " and " id(a) == id(b) " the same?

Erik Max Francis max at alcyone.com
Sun Mar 16 01:24:33 EST 2003


Chen wrote:

> Some one said that " a is b " is the same as " id(a) == id(b) ". But
> it
> seems not always true from the following codes:
> 
> >>> class a:
> ...     def f(self):
> ...         pass
> ...     g=f
> 
> >>> b=a()
> >>> print id(a.f), id(b.f), id(a.g), id(b.g)
> 6759528 6759528 6759528 6759528
> >>> print a.f is b.f
> False
> >>> print a.f is a.g
> False
	...

a is b is the same as id(a) == id(b), provided that a and b are of the
same "thing."  There are rare cases in which objects with the same ID
(which in CPython just represents an address) are actually distinct
objects.  In your case, a is a class, but c is an _instance_ of a class.
So a.f is an unbound method, but b.f is a bound method.  They're the
same method, but they're different forms.  The easiest way to see this
is to get the repr of the objects themselves:

>>> class a:
...  def f(self): pass
... 
>>> b = a()
>>> a
<class __main__.a at 0x8117644>
>>> b
<__main__.a instance at 0x8159664>
>>> a.f
<unbound method a.f>
>>> b.f
<bound method a.f of <__main__.a instance at 0x8159664>>

As far as I know, this is a CPython implementation detail; in Jython,
unbound and bound methods have different IDs.

-- 
 Erik Max Francis / max at alcyone.com / http://www.alcyone.com/max/
 __ San Jose, CA, USA / 37 20 N 121 53 W / &tSftDotIotE
/  \ But since when can wounded eyes see / If we weren't who we were
\__/ Joi
    Blackgirl International / http://www.blackgirl.org/
 The Internet resource for black women.




More information about the Python-list mailing list