有人可以告诉我这段代码之间的区别是什么:
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教程中提到过,但我无法理解它。
答案 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
)。