Unexpected behaviour from the 'in' operator

Blair Hall b.hall at irl.cri.nz
Mon Feb 24 05:19:31 CET 2003

I have just noticed that the 'in' operator for lists appears to
use the __eq__ method of a class. This does not
provide the behaviour I expected when implementing
an ad hoc numeric class type.

Here is some code:

class A(object):
    def __init__(self,x):
        self.x = x

    def __eq__(self,other):
        print 'eq'
        return self.x == other
if(__name__ == '__main__'):
    x = A(1)
    y = A(1)
    lst = [x]
    print y in lst        # prints 1

The 'y in lst' expression evaluates to true here, because
both x and y are equal to the same value. However,
x and y are not the same object!  It seems to me that
the comparison should use something like the id() function
instead of __eq__.

More information about the Python-list mailing list