2016-02-04 152 views
1

有人能告诉我这是什么代码之间的区别:遍历列表的Python

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

为什么你需要一个循环?只要'x.insert(0,5)'就可以用于这个例子 –

+0

这不是重点,我试图理解Okey的机制 –

回答

6

在第一个版本中,您创建一个副本(通过从头到尾切分列表),在第二个版本中迭代原始列表。

如果迭代容器,其大小在迭代过程中不能更改,原因很充分(请参见下文)。但是,由于您致电x.insert,列表的大小会发生变化。


如果执行的第二个版本,它实际上不会立即抛出一个错误,但将无限期持续,填补了清单了越来越多的5S:

一旦你在列表索引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)。

+0

,但是如果我在最后添加“print(x)”,它会显示修改后的x(其中x [0]为5),因此这将表明x的大小确实发生了变化 –

+0

另外OP应该注意,这两种方法在Python 3.x中都不起作用 – kmario23

+0

@ kmario23两者均可在Python 3完全像在Python 2中一样。 – L3viathan