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
指向空来减少它的引用计数。
虽然以下在技术上有效,但通过删除对对象的所有(已知)引用,它有其自身的问题(涉及修改您当前正在迭代的列表)并且不应使用。
>>> 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 ]