繁体   English   中英

迭代列表Python

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM