要了解发生这种情况的原因,让我们逐步了解内部发生的情况。
第 1 步:
>>> foo = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
这里创建了一个新的列表对象并分配给foo。
第 2 步:
>>> for i in foo:
现在,迭代开始。 i 循环变量被赋值为 index 0 处的 item 的值,即 'a'。
第 3 步:
>>> foo.remove(i)
>>> print foo
['b', 'c', 'd', 'e', 'f', 'g', 'h']
现在,.remove(i) 执行 .remove(foo[0]) 而不是 .remove('a') 显然。新列表现在在索引 0 处有 'b',在索引 1 处有 'c',依此类推。
第 4 步:
>>> for i in foo:
对于下一次迭代,i 循环变量被赋值为索引 1 处的项目的值,当前为 'c'。
第 5 步:
>>> foo.remove(i)
>>> print foo
['b', 'd', 'e', 'f', 'g', 'h']
这一次,.remove(i) 执行.remove(foo[1]),将'c' 从列表中删除。当前列表现在在索引 0 处有 'b',在索引 1 处有 'd',依此类推。
第 6 步:
>>> for i in foo:
对于下一次迭代,i 循环变量被赋值为 index 2 处的 item 的值,当前为 'e'。
第 7 步:
>>> foo.remove(i)
>>> print foo
['b', 'd', 'f', 'g', 'h']
这一次,.remove(i) 执行.remove(foo[2]),将'e' 从列表中删除。同样,项目的索引也会像上面的第 5 步那样更改。
第 8 步:
>>> for i in foo:
对于下一次迭代,i 循环变量被赋值为 index 3 处的 item 的值,当前为 'g'。
第 9 步:
>>> foo.remove(i)
>>> print foo
['b', 'd', 'f', 'h']
这一次,.remove(i) 执行 .remove(foo[3]),将 'g' 从列表中删除。
第 10 步:
>>> for i in foo:
现在,i 应该指向 索引 4 处的项目,但由于原始列表已减少到 4 个元素,执行将在此处停止。
>>> foo
['b', 'd', 'f', 'h']
以上是执行后的最终列表。
一些结论: