Python 使用for循环时的列表扩展

Python 使用for循环时的列表扩展,python,list,for-loop,Python,List,For Loop,我正在学习Python,在一次练习中,我遇到了这种情况: words = ['one', 'two', 'three'] for w in words if len(w) == 5: words.insert(0,w) 现在,这里发生的是,当循环迭代最后一个单词并找到匹配项时,它在列表的开头插入新词,并随着列表的长度增加1而继续循环。这导致了一个无限循环 现在,我更改了如下代码: words = ['one', 'two', 'three'] for w in wor

我正在学习Python,在一次练习中,我遇到了这种情况:

words = ['one', 'two', 'three']
for w in words
    if len(w) == 5:
        words.insert(0,w)
现在,这里发生的是,当循环迭代最后一个单词并找到匹配项时,它在列表的开头插入新词,并随着列表的长度增加1而继续循环。这导致了一个无限循环

现在,我更改了如下代码:

words = ['one', 'two', 'three'] 
for w in words[:]
    if len(w) == 5:
        words.insert(0,w)
结果和我预料的完全一样。开头只添加了一个单词并退出循环


有人能解释一下第一段代码中到底发生了什么吗?

您在循环中对修改过的列表进行了迭代。在大多数情况下,这是个坏主意


也许您缺少的是
words[:]
创建了
words
的副本。您迭代副本,因此当您添加到原始列表时,一切正常。

与您之前所说的完全相同。主要区别在于“单词”将引用您的原始列表,而单词[:]返回一个>新的<列表,供您迭代。这意味着您将不会编辑与迭代相同的列表。为什么不复制
单词
并在循环下插入?在循环下操作列表通常是一个坏主意。Anzel:这正是words[:]所做的。:)我假设在第二段代码中,在运行时,列表被展开,变量在每次迭代中都使用每个元素。但我想知道为什么在第一段代码中没有发生这种情况?好吧,我假设的是,从C背景开始,在第一个实例中,对于每个迭代,(第一个元素的地址)+(迭代计数),由于在开始时添加了元素,它总是选择最后一个元素并在无限循环中继续。@sunirleddy在引擎盖下有一个循环
,用于(int i=0;i
。当您添加一个元素时,
length(lst)
将递增,并且由于您添加到前面,因此第i个元素现在是第(i+1)个元素。在下一次迭代中,您碰到了相同的元素。因此,该条件再次为真,得到一个无限循环。如果这是你的意思,那么是的。:)谢谢。我将安然入睡:)