[英]Iterating over list 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
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.