Python:使用del in for循环

时间:2013-11-06 18:30:18

标签: python for-loop del

当我意识到del似乎不起作用时,我正在迭代一个带有for循环的列表。我假设这是因为我表示for循环的对象,而del只是删除该对象而不是引用。

然而,我确信我之前做过类似的事情并且有效。

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

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

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

有没有办法可以用这种方式删除数字或字符串?我做错了吗?

感谢。

4 个答案:

答案 0 :(得分:2)

您对于为什么看到这种行为的想法是正确的。因此,我不会过去。

要执行您想要的操作,请使用list comprehension过滤列表:

>>> 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-loop更有效。

答案 1 :(得分:1)

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

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

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

没有效果。

答案 2 :(得分: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指向任意内容即可减少其引用次数。

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

>>> 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 ]

答案 3 :(得分:0)

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

del alist[i]

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

但实际上你应该使用list comprehension创建另一个列表:

[x for x in alist if x != 8]