当我意识到del似乎不起作用时,我正在迭代一个带有for循环的列表。我假设这是因为我表示for循环的对象,而del只是删除该对象而不是引用。
然而,我确信我之前做过类似的事情并且有效。
alist = [6,8,3,4,5]
for i in alist:
if i == 8:
del i
在我的代码中,它实际上是一个字符串列表,但结果是相同的:即使满足if条件,删除i也没有效果。
有没有办法可以用这种方式删除数字或字符串?我做错了吗?
感谢。
答案 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:alist
和i
本身所引用的引用。当您致电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]