示例:
l = [1,2,3,4,5,6,7,8,9,0]
for i in l:
print i,l
l.remove(i)
退货:
1 [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
3 [2, 3, 4, 5, 6, 7, 8, 9, 0]
5 [2, 4, 5, 6, 7, 8, 9, 0]
7 [2, 4, 6, 7, 8, 9, 0]
9 [2, 4, 6, 8, 9, 0]
那为什么只有5次旋转?我希望它转10次。 有人可以一步一步地向我解释吗?
答案 0 :(得分:5)
注意打印的数字是如何跳过列表中的一个数字的?这是因为,我指向列表中的一个位置,一旦你删除i
列表“向左移动”一个位置,而在i
递增时,它实际上向右移动了两个位置。因此,在第五次迭代之后,您将位于0
右侧或列表之外的位置。
答案 1 :(得分:1)
此问题独立于所使用的编程语言(在本例中为Python),并且在迭代时从集合中删除项目时会发生此问题。在此示例中,在每次循环迭代之后,集合中当前项的索引自动增加1以指向下一个项;当您删除某个项目时,项目会一个一个地移动,缺少其中一个项目。
防止这种情况的一种方法是以相反的顺序遍历列表。
for i in reversed(l):
print( i,l)
l.remove(i)
生成:
0 [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
9 [1, 2, 3, 4, 5, 6, 7, 8, 9]
8 [1, 2, 3, 4, 5, 6, 7, 8]
7 [1, 2, 3, 4, 5, 6, 7]
6 [1, 2, 3, 4, 5, 6]
5 [1, 2, 3, 4, 5]
4 [1, 2, 3, 4]
3 [1, 2, 3]
2 [1, 2]
1 [1]