2017-02-13 229 views
2

当我试图删除元素的所有元素通过循环是这样的:广东话删除通过pop方法

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 12, 122] 
for z in numbers: 
    a = numbers.pop(0) 
print(numbers) 

这就是我得到:

[8, 9, 10, 18, 12, 122] 

为什么它不删除所有元素?为什么? 谢谢!

+2

为你迭代 –

+0

'在数z不要修改列表[:]:'应该工作。 –

+1

@KlausD:可能更好的方法是将范围放在'len(..)'上,因为这需要更少的内存。 –

回答

4

您的代码将删除一半。因为当你使用for循环时,它将迭代元素。现在移除列表另一侧的元素,这样两个指针将在中途到达彼此,因此循环将停止。

所以,你开始的列表:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 12, 122] 
#^ 

*(插入符号表示在for循环指针所在的位置),接下来你弹出和推进尖号:

[2, 3, 4, 5, 6, 7, 8, 9, 10, 18, 12, 122] 
# ^

等:

[4, 5, 6, 7, 8, 9, 10, 18, 12, 122] 
# ^
[5, 6, 7, 8, 9, 10, 18, 12, 122] 
#  ^
[6, 7, 8, 9, 10, 18, 12, 122] 
#   ^
[7, 8, 9, 10, 18, 12, 122] 
#    ^
[8, 9, 10, 18, 12, 122] 
#     ^

现在索引指针到达一个点超出该范围时,因此循环终止。但是它并没有重复所有的元素:因为每次你弹出一个元素,它就立即跳了两步就这么说。

约遍历列出了一些一般性的建议:

您做的更好修改列表,而你遍历它。

一个更好的办法来做到这一点是:

for _ in range(len(numbers)): 
    a = numbers.pop(0) 
print(numbers)

,或者为@Matthias提出:

while numbers: 
    a = numbers.pop(0) 
print(numbers)

由于列表bool(..)是真的包含至少一个元件。所以这里每次我们检查numbers中是否至少还有一个元素。

+0

其实OP从开始删除('.pop(0)'),而不是结束... –

+0

@brunodesthuilliers:我刚刚注意到。编辑... –

+0

'list.pop(0)'是O(n),我不认为这是很好的建议,以这种方式使用它。此问题的核心显然是一个骗局 –