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可能正在检查对象引用,这是有道理的。有什么更明确的我可以看一下吗?
答案 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
为真。