Skip to content Skip to sidebar Skip to footer

Specifics Of List Membership

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,

Solution 1:

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

Solution 2:

Here is code from the Python SVN:

staticintlist_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.

Solution 3:

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.

Post a Comment for "Specifics Of List Membership"