-->

Python的:在使用德尔for循环(Python: Using del in for loops)

2019-10-30 04:28发布

我是通过列表迭代一个for循环,当我意识到德尔似乎不起作用。 我想这是因为i被表示为循环的一个对象和德尔被简单地删除该对象,而不是参考。

然而,我确信我以前做了这样的事情,它的工作。

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

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

在我的代码实际上它的字符串列表,但结果是一样的:即使如果有条件满足,删除我没有任何影响。

有没有一种方法,我可以删除这样一个数字或字符串? 难道我做错了什么?

谢谢。

Answer 1:

你,为什么你看到这种行为的想法是正确的。 因此,我不会去了这一点。

做你想做的,使用列表解析来过滤列表:

>>> 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循环。



Answer 2:

for循环一个新值赋给i在每次运行。

因此,从本质上讲,你for以上循环不

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

其中有没有效果。



Answer 3:

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指向什么。

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


Answer 4:

如果你真的想使用德尔你需要使用就行了:

del alist[i]

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

但实际上在这里你应该只使用列表理解创建另一个列表:

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


文章来源: Python: Using del in for loops