我是通过列表迭代一个for循环,当我意识到德尔似乎不起作用。 我想这是因为i被表示为循环的一个对象和德尔被简单地删除该对象,而不是参考。
然而,我确信我以前做了这样的事情,它的工作。
alist = [6,8,3,4,5]
for i in alist:
if i == 8:
del i
在我的代码实际上它的字符串列表,但结果是一样的:即使如果有条件满足,删除我没有任何影响。
有没有一种方法,我可以删除这样一个数字或字符串? 难道我做错了什么?
谢谢。
你,为什么你看到这种行为的想法是正确的。 因此,我不会去了这一点。
做你想做的,使用列表解析来过滤列表:
>>> 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循环。
该for
循环一个新值赋给i
在每次运行。
因此,从本质上讲,你for
以上循环不
i = 6
i = 8
del i
i = 3
i = 4
i = 5
其中有没有效果。
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
指向什么。
虽然techinically工作,通过删除所有(已知)引用的对象之后,它有它自己的问题(涉及修改您当前迭代的列表),不应该被使用。
>>> 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 ]
如果你真的想使用德尔你需要使用就行了:
del alist[i]
(注意,在这种情况下, i
是一个索引,而不是你要删除的值)
但实际上在这里你应该只使用列表理解创建另一个列表:
[x for x in alist if x != 8]