When comparing two objects in a tuple Python first check to see if they are the same.
Note that numpy.nan is numpy.nan
, but float('nan') is not float('nan')
.
In Objects/tupleobject.c
, the comparison is carried out like this:
for (i = 0; i < vlen && i < wlen; i++) {
int k = PyObject_RichCompareBool(vt->ob_item[i],
wt->ob_item[i], Py_EQ);
if (k < 0)
return NULL;
if (!k)
break;
}
And in PyObject_RichCompareBool
, you can see the check for equality:
if (v == w) {
if (op == Py_EQ)
return 1;
else if (op == Py_NE)
return 0;
}
You can verify this with the following example:
class A(object):
def __eq__(self, other):
print "Checking equality with __eq__"
return True
a1 = A()
a2 = A()
If you try (a1, 1) == (a1, 1)
nothing get printed, while (a1, 1) == (a2, 1)
would use __eq__
and print our the message.
Now try a1 == a1
and see if it surprises you ;P