当我试图通过循环删除元素时:
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]
为什么它不会删除所有元素?为什么会这样? 谢谢!
答案 0 :(得分: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
中是否至少还有一个元素。