Skip to main content
 首页 » 编程设计

python之遍历列表的切片副本

2025年05月04日11mate10pro

我想了解循环列表和循环列表的“切片”副本之间的区别。

因此,例如,在下面的列表中,长度大于 6 的元素被追加到列表的开头:

words = ['cat', 'window', 'blahblah'] 
 
for word in words[:]: 
    if len(word) > 6: 
        words.insert(0, word) 
 
print(words) 
 
words = ['blahblah', 'cat', 'window', 'blahblah'] 

然后,我运行以下命令以查看为什么这不是正确的方法,但是我的解释器卡住了,我必须退出。为什么会这样?我只是将一些内容附加到我的列表的开头,这是允许的,因为列表是可变的...

for word in words: 
    if len(word) > 6: 
        words.insert(0, word) 

谁能帮我理解为什么这最后一点停止了我的程序?

请您参考如下方法:

words 列表包含三个元素。 words 的副本也是如此。您遍历副本,如果当前元素超过 6 个字符,则在 words 中插入一些内容,然后完成。

现在让我们看看当您直接遍历 words 时会发生什么:

前两个迭代步骤没问题,因为条件为 False。但是由于 len('blahblah') > 6,您现在要在列表的开头插入 'blahblah'。现在列表如下所示:

['blahblah', 'cat', 'window', 'blahblah']

你刚刚看到了第三个元素,所以现在循环继续并查看第四个元素,但是因为你在列表的开头插入了一些东西,所以列表的其余部分发生了移动,新的第四个元素是 再次“blahblah”。 blahblah 仍然超过 6 个字符,您在开头再次插入它并陷入无限循环:

['cat', 'window', 'blahblah'] 
   ^ 
['cat', 'window', 'blahblah'] 
            ^ 
['cat', 'window', 'blahblah'] 
                       ^ 
['blahblah', 'cat', 'window', 'blahblah'] 
                                   ^ 
['blahblah', 'blahblah', 'cat', 'window', 'blahblah'] 
                                               ^ 
...