在python列表中,`in`的行为与`index`有何不同
令我自己非常沮丧的是,我成功地用python列出了一个对象列表,导致以下失败:在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的对象,并且不会在其他地方进行修改 这两个函数都是幂等的,不修改状态
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)
调用returnFalse
和foo.\uu eq\uu(other)
从未被查询过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)
调用returnFalse
和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
,并将测试相反的值。