有人能告诉我这是什么代码之间的区别:遍历列表的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教程中提到的,但我不太明白。
有人能告诉我这是什么代码之间的区别:遍历列表的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教程中提到的,但我不太明白。
在第一个版本中,您创建一个副本(通过从头到尾切分列表),在第二个版本中迭代原始列表。
如果迭代容器,其大小在迭代过程中不能更改,原因很充分(请参见下文)。但是,由于您致电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
)。
为什么你需要一个循环?只要'x.insert(0,5)'就可以用于这个例子 –
这不是重点,我试图理解Okey的机制 –