How does Python (2.6.4, specifically) determine list membership in general? I've run some tests to see what it does:
def main():
obj = fancy_obj(arg='C:\\')
needle = (50, obj)
haystack = [(50, fancy_obj(arg='C:\\')), (1, obj,), needle]
print (1, fancy_obj(arg='C:\\'),) in haystack
print needle in haystack
if __name__ == '__main__':
main()
Which yields:
False
True
This tells me that Python is probably checking the object references, which makes sense. Is there something more definitive I can look at?
Membership List means a list, in alphabetical order by name, setting forth the name, address and business or home telephone number of, and number of Shares held by, each Member, which list shall be printed on white paper in a readily readable type size (in no event smaller than 10-point type) and shall be updated at ...
Membership Status means the designation of a member as either Full Member, Alert Member, or Probationary Member.
From (An Unofficial) Python Reference Wiki:
For the list and tuple types, x in y
is true if and only if there exists an index i such that x == y[i]
is true.
So in your example, if the fancy_obj
class stored the value of arg
in an instance variable and were to implement an __eq__
method that returned True if the two fancy_objs
being compared had the same value for arg
then (1, fancy_obj(arg='C:\\'),) in haystack
would be True.
The relevant page of the Standard Library reference is: Built-in Types, specifically 5.6 Sequence Types
Here is code from the Python SVN:
static int
list_contains(PyListObject *a, PyObject *el)
{
Py_ssize_t i;
int cmp;
for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i)
cmp = PyObject_RichCompareBool(el, PyList_GET_ITEM(a, i),
Py_EQ);
return cmp;
}
so basically it uses the ==
with the object and each object in the list.
Python is using the (equivalent of) the ==
operator. If the fancy_obj
class does not define __eq__
(or the crufty old __cmp__
, still supported for backwards compatibility) then equality, ==
, "falls back" to identity, is
, and that appears to be what's happening here.
The relevant docs are here, and I quote:
x in s
True if an item of s is equal to x, else False
and "equal to" means ==
is true.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With