如何通过引用删除对象?

时间:2014-02-20 16:02:20

标签: python

我正在尝试编写一些代码来操作列表,如下所示:

>>> a = [[0,0],[0,1],[0,2]]
>>> b = a[1]
>>> b[1] = 3
>>> a
[[0,0],[0,3],[0,2]]
>>> # So far so good
>>> del b
>>> a
[[0,0],[0,3],[0,2]]
>>> # Huh.

如何使用指向该项目的变量从列表中删除项目?

编辑:

好的,所以看起来这个操作在Python中是不可能的,考虑到它与迭代列表的pythonic方式相似,这似乎是一种耻辱。 C中的等效操作通过指针非常简单。在没有给出正确答案的情况下结束这个问题。

5 个答案:

答案 0 :(得分:3)

引自del docs

  

删除名称会删除该名称与本地名称的绑定   全局命名空间,取决于名称是否出现在全局中   同一代码块中的语句。如果名称未绑定,则为NameError   异常将被提出。

因此,您实际上是取消名称b与当前名称空间的链接,而不是从列表中删除数据。

  

传递删除属性引用,订阅和切片   涉及的主要对象;通常删除切片   相当于分配一个正确类型的空切片(但是甚至   这是由切片的对象确定的。

所以,你应该做

del a[1]

这是删除元素的正确方法。

编辑:这样做的唯一万无一失的方法就是这个

c = [0, 0]
a = [c, c, [0, 2]]
b = a[0]
for idx in xrange(len(a) - 1, -1, -1):
    if a[idx] is b:
        del a[idx]
print a # [[0, 2]]

或者您可以继续使用.remove从列表中删除该项,直到它引发错误,例如

try:
    while True:
        a.remove(b)
except ValueError, e:
    pass
print a

答案 1 :(得分:3)

不,你不能那样做。

del只是取消实例对象中的var名称绑定。如果您想按索引对列表中的元素进行del,请使用pop(index)

In [46]: a=range(4)

In [47]: a.pop(2)
Out[47]: 2

In [48]: a
Out[48]: [0, 1, 3]

del a[index]

In [50]: del a[2] #this time it deletes "3" in list "a"

In [51]: a
Out[51]: [0, 1]

答案 2 :(得分:1)

这是你想要的吗?

>>> a
[[0, 0], [0, 1], [0, 2]]
>>> del b[:]
>>> a
[[0, 0], [], [0, 2]]

答案 3 :(得分:1)

如果您不知道索引,请尝试以下操作。 (使用is运算符测试对象标识)。

>>> c = [0, 0]
>>> a = [c, c, [0, 2]]
>>> b = a[0]
>>> for j in reversed([i for i, x in enumerate(a) if x is b]): # find indice.
...     del a[j]
...
>>> a
[[0, 2]]

答案 4 :(得分:0)

您正在寻找a.remove(b)

Is the basic documentation for python lists