在python列表中,`in`的行为与`index`有何不同

在python列表中,`in`的行为与`index`有何不同,python,list,python-3.x,containment,Python,List,Python 3.x,Containment,令我自己非常沮丧的是,我成功地用python列出了一个对象列表,导致以下失败: if foo in lst: lst.index(foo) # ValueError: <foo> is not in list 如果foo在lst中: 列表索引(foo)#值错误:不在列表中 我向你保证,这里没有诡计: foo是一个具有自定义\uuuuuu散列\uuuuuuuu和\uuuuuuuuuu eq\uuuuuuuu的对象,并且不会在其他地方进行修改 这两个函数都是幂等的,不修改状态

令我自己非常沮丧的是,我成功地用python列出了一个对象列表,导致以下失败:

if foo in lst:
    lst.index(foo) # ValueError: <foo> is not in list
如果foo在lst中:
列表索引(foo)#值错误:不在列表中
我向你保证,这里没有诡计:

  • foo
    是一个具有自定义
    \uuuuuu散列\uuuuuuuu
    \uuuuuuuuuu eq\uuuuuuuu
    的对象,并且不会在其他地方进行修改
  • 这两个函数都是幂等的,不修改状态
  • lst
    是一种标准的python
    []
    ,没有诅咒

  • listobject中的
    obj
    (或
    listobject.\uuuuuu包含\uuuuj(obj)
    )和
    listobject.index()
    之间的唯一区别是比较是反向的

    列表\u包含
    功能:

    for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i)
        cmp = PyObject_RichCompareBool(el, PyList_GET_ITEM(a, i),
                                           Py_EQ);
    
    其中,
    el
    v
    是查找的对象,
    PyList\u GET\u项(a,i)
    self->ob\u项[i]
    是列表中包含的对象

    因此,
    lst.index()
    抛出一个
    ValueError
    异常,因为所有的
    other.\uuuuu eq\uuuu(foo)
    调用return
    False
    foo.\uu eq\uu(other)
    从未被查询过foo之所以有效,是因为
    foo.\uuuu eq\uuuu(其他)
    至少返回一个值的
    True


    你没有给我们一个示例列表和
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
    实现来验证为什么对所有
    其他
    调用返回
    False.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
    比较是反向的

    列表\u包含
    功能:

    for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(a); ++i)
        cmp = PyObject_RichCompareBool(el, PyList_GET_ITEM(a, i),
                                           Py_EQ);
    
    其中,
    el
    v
    是查找的对象,
    PyList\u GET\u项(a,i)
    self->ob\u项[i]
    是列表中包含的对象

    因此,
    lst.index()
    抛出一个
    ValueError
    异常,因为所有的
    other.\uuuuu eq\uuuu(foo)
    调用return
    False
    foo.\uu eq\uu(other)
    从未被查询过foo之所以有效,是因为
    foo.\uuuu eq\uuuu(其他)
    至少返回一个值的
    True



    你还没有给我们一个示例列表和
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
    实现来验证为什么
    其他所有
    调用都返回
    False.\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?“我得到一个错误”是最糟糕的错误报告。@MartijnPieters进行了最少的演示now@00500005:顺便说一句,我没有投反对票,但如果没有回溯和
    \uuuuuu eq\uuuuu
    方法,我们将不得不猜测更多,你能解释一下为什么这是一个糟糕的问题吗?你能给我们展示一下定制的
    \uuuuuueq\uuuuuu
    方法吗?你能给我们展示一下实际的错误和回溯吗?“我得到一个错误”是最糟糕的错误报告。@MartijnPieters进行了最少的演示now@00500005:顺便说一句,我没有投反对票,但如果没有回溯和
    \uuuuuu eq\uuuuuu
    方法,我们将不得不进行超出必要范围的推测……或者你可能不得不像往常一样猜测准确的金额:)谢谢,这非常有用。深度对象堆栈使最小复制变得困难。我的问题:
    [f代表lst中的f,如果f==foo]!=[f代表lst中的f,如果foo==f]
    @00500005:显然,您的
    f.\uu eq\uu
    方法需要改进。当您无法确定两个对象不相等时,返回
    NotImplemented
    单例,而不是
    False
    ,并将对其进行反向测试……或者您可能只需要像往常一样推测准确的数量:)谢谢,这有助于解决问题。深度对象堆栈使最小复制变得困难。我的问题:
    [f代表lst中的f,如果f==foo]!=[f代表lst中的f,如果foo==f]
    @00500005:显然,您的
    f.\uu eq\uu
    方法需要改进。当无法确定两个对象不相等时,返回
    NotImplemented
    单例,而不是
    False
    ,并将测试相反的值。