Python list.remove(value)如何确定要删除的值?

时间:2013-12-20 01:57:47

标签: python list memory python-internals

如果我有对象列表:

l = [a, b, c]

然后我删除其中一个对象:

l.remove(a)

如何确定列表中的哪个项目要删除(在引擎盖下)?

是否使用a的内存位置? (您可以使用hex(id(a))

查看

3 个答案:

答案 0 :(得分:6)

  1. 它遍历列表,将每个项目与要删除的项目进行比较,如果找到匹配项,则只删除它。它适用于O(N)。资料来源:https://wiki.python.org/moin/TimeComplexity

  2. 它只删除第一个匹配的项目并立即返回。

  3. 如果要移除的项目不存在,则会失败并显示ValueError

  4. 这是listremove函数,它从列表中删除项目,并使用PyObject_RichCompareBool检查项目是否相同。 PyObject_RichCompareBool就像这样实现了

    /* Quick result when objects are the same.
       Guarantees that identity implies equality. */
    if (v == w) {
        if (op == Py_EQ)
            return 1;
        else if (op == Py_NE)
            return 0;
    }
    
    res = PyObject_RichCompare(v, w, op);
    

    如果对象的标识相同(如果两个对象相同),则返回1,否则比较值并返回结果。

答案 1 :(得分:3)

Python使用相等性测试==remove方法类似于以下函数:

def list_remove(a, el):
    for i in range(len(a)):
        if a[i] == el:
            del a[i]
            return
    raise ValueError("item not found")

答案 2 :(得分:0)

  1. 如果列表中成员对象的类定义了__eq__()方法或__cmp__()方法,它将调用此方法进行比较。

  2. 如果不自定义比较方法,则类的非相同实例通常比较为不相等。它表示对象地址用于比较。