0

例子:

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

4

2 回答 2

5

注意打印的数字是如何跳过列表中的一个数字的?那是因为, i 指向列表中的一个位置,一旦你删除i列表“移动”一个位置到左边,而不是i增加时,它实际上向右移动两个位置。因此,在第五次迭代之后,您将处于列表右侧0或列表之外的位置。

于 2013-02-06T16:41:07.533 回答
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]
于 2013-02-06T16:52:50.770 回答