迭代列表Python

时间:2016-02-04 16:51:23

标签: python list slice

有人可以告诉我这段代码之间的区别是什么:

x = [1, 2, 3, 4, 5, 6, 7]
for i in x[:]:
    if i == 5:
        x.insert(0, i)

这段代码:

x = [1, 2, 3, 4, 5, 6, 7]
for i in x:
    if i == 5:
        x.insert(0, i)

为什么第二个不起作用?我知道它在Python教程中提到过,但我无法理解它。

1 个答案:

答案 0 :(得分:7)

在第一个版本中,您创建一个副本(通过从头到尾切割列表),在第二个版本中,您将重复原始列表。

如果迭代容器,其大小在迭代期间不会发生变化,原因很充分(见下文)。但是,当您拨打x.insert时,列表的大小会发生变化。

如果您执行第二个版本,它实际上不会立即抛出错误,但会无限期地继续,使用越来越多的5个填充列表:

一旦您进入列表索引4(因此i为5),您就会在列表的开头插入5:

[5, 1, 2, 3, 4, 5, 6, 7]

然后你继续循环,隐式地将你的索引增加到5,现在又是5,因为你的插入导致整个列表向右移动一个,所以将再插入5个:

[5, 5, 1, 2, 3, 4, 5, 6, 7]

这种情况永远持续下去" (直到那里有一个MemoryError)。