8

如果我有对象列表:

l = [a, b, c]

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

l.remove(a)

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

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

4

3 回答 3

7
  1. 它遍历列表,将每个项目与要删除的项目进行比较,如果找到匹配项,则将其删除。它在 O(N) 中工作。来源:https ://wiki.python.org/moin/TimeComplexity

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

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

这是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否则比较值并返回结果。

于 2013-12-20T02:00:02.907 回答
4

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")
于 2013-12-20T02:02:48.580 回答
1
  1. 如果列表中成员对象的类定义了__eq__()方法或__cmp__()方法,则调用该方法进行比较。

  2. 如果不自定义比较方法,则类的不同实例通常比较为不相等。这意味着对象地址用于比较。

于 2013-12-20T02:29:23.130 回答