1

当我意识到 del 似乎不起作用时,我正在使用 for 循环遍历列表。我认为这是因为 i 代表 for 循环的一个对象,而 del 只是删除该对象而不是引用。

然而,我确信我以前做过这样的事情并且它奏效了。

alist = [6,8,3,4,5]  

for i in alist:  
    if i == 8:  
        del i  

在我的代码中,它实际上是一个字符串列表,但结果是一样的:即使满足 if 条件,删除 i 也没有效果。

有没有办法以这种方式删除数字或字符串?难道我做错了什么?

谢谢。

4

4 回答 4

3

您对为什么看到这种行为的想法是正确的。因此,我将不再赘述。

要执行您想要的操作,请使用列表推导来过滤列表:

>>> alist = [6,8,3,4,5]
>>> [x for x in alist if x != 8]
[6, 3, 4, 5]
>>> alist = [6,8,8,3,4,5]
>>> [x for x in alist if x != 8]
[6, 3, 4, 5]
>>>

这种方法也比 for 循环更有效。

于 2013-11-06T18:33:51.873 回答
1

del不删除对象。它只是减少其参数引用的对象的引用计数。在您的代码中

alist = [6,8,3,4,5]  

for i in alist:  
    if i == 8:  
        del i

你有 6 个对象:5 个单独的整数,以及 5 个引用的列表(每个整数一个)。for循环通过在 中的每个元素执行一次其主体来工作,alist并在每次迭代i中保存对不同元素的引用。alist无论哪个对象被引用,i其引用计数至少为 2:由alisti自身持有的引用。当你调用 时del i,你只是通过i指向空来减少它的引用计数。

虽然以下在技术上有效,但通过删除对对象的所有(已知)引用,它有其自身的问题(涉及修改您当前正在迭代的列表)并且不应使用。

>>> alist=[6,8,3,4,5]
>>> for i, a in enumerate(alist):
...   if a == 8:
...     del a        # delete the loop index reference
...     del alist[i] # delete the reference held by the list
>>> alist
[6,3,4,5]

相反,只需使用列表推导来构建一个新列表来替换旧列表

alist = [ x for x in alist if x != 8 ]
于 2013-11-06T19:00:19.793 回答
1

循环在每次运行时for分配一个新值。i

所以,基本上,你for上面的循环确实

i = 6
i = 8
del i
i = 3
i = 4
i = 5

这没有效果。

于 2013-11-06T18:33:20.337 回答
-1

如果你真的想使用 del 你需要在列表中使用它:

del alist[i]

(请注意,在这种情况下i是索引,而不是您要删除的值)

但实际上,您可能应该只使用列表推导创建另一个列表:

[x for x in alist if x != 8]
于 2013-11-06T18:42:15.003 回答