Python:在for循环中使用del

vyu0f0g1  于 2023-10-15  发布在  Python
关注(0)|答案(4)|浏览(124)

我正在用for循环遍历一个列表,这时我意识到del似乎不起作用。我假设这是因为i表示for循环的对象,del只是删除该对象而不是引用。
然而,我确信我以前做过这样的事情,而且很有效。

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

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

在我的代码中,它实际上是一个字符串列表,但结果是一样的:即使满足if条件,删除i也没有效果。
有没有一种方法可以用这种方法删除一个数字或字符串?我做错什么了吗?
谢谢.

ecbunoof

ecbunoof1#

你关于为什么你看到这种行为的想法是正确的。因此,我就不多说了。
要做你想做的事情,使用列表解析(它在旧版python2中也可用)来过滤列表:

>>> 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循环有效得多。

fdx2calv

fdx2calv2#

for循环在每次运行时为i分配一个新值。
因此,实际上,上面的for循环

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

但没有效果

xam8gpfp

xam8gpfp3#

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

tktrz96b4#

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

del alist[i]

(note在这种情况下,i是一个索引,而不是你想要删除的值)
但实际上,在这里你可能应该使用列表解析来创建另一个列表:

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

相关问题