列表成员资格的细节

时间:2010-06-15 22:53:07

标签: python list

Python(特别是2.6.4)如何确定列表成员资格?我已经进行了一些测试,看看它的作用:

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()

哪个收益率:

False
True

这告诉我Python可能正在检查对象引用,这是有道理的。有什么更明确的我可以看一下吗?

3 个答案:

答案 0 :(得分:4)

来自(An Unofficial) Python Reference Wiki

对于列表和元组类型,当且仅当存在索引i使x in y为真时,x == y[i]才为真。

因此,在您的示例中,如果fancy_obj类在实例变量中存储了arg的值,并且要实现__eq__方法,如果两个fancy_objs返回True被比较的arg具有相同的值,那么(1, fancy_obj(arg='C:\\'),) in haystack将为True。

标准库参考的相关页面为:Built-in Types,具体为5.6 Sequence Types

答案 1 :(得分:4)

以下是来自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;
}

所以基本上它使用==与对象和列表中的每个对象。

答案 2 :(得分:3)

Python正在使用(相当于)==运算符。如果fancy_obj类未定义__eq__(或仍然支持向后兼容性的古老__cmp__),则等式==,“回退”为标识,{ {1}},这似乎就是这里发生的事情。

相关文档为here,我引用:

is如果s项等于x,则为真,否则为假

和“等于”表示x in s为真。