当我试图删除元素的所有元素通过循环是这样的:广东话删除通过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]
为什么它不删除所有元素?为什么? 谢谢!
当我试图删除元素的所有元素通过循环是这样的:广东话删除通过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]
为什么它不删除所有元素?为什么? 谢谢!
您的代码将删除一半。因为当你使用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
中是否至少还有一个元素。
其实OP从开始删除('.pop(0)'),而不是结束... –
@brunodesthuilliers:我刚刚注意到。编辑... –
'list.pop(0)'是O(n),我不认为这是很好的建议,以这种方式使用它。此问题的核心显然是一个骗局 –
为你迭代 –
'在数z不要修改列表[:]:'应该工作。 –
@KlausD:可能更好的方法是将范围放在'len(..)'上,因为这需要更少的内存。 –