请解释这个循环:因为我在l:l.remove(i)

时间:2013-02-06 16:38:46

标签: python

示例:

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次。 有人可以一步一步地向我解释吗?

2 个答案:

答案 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]