我想了解循环列表和循环列表的“切片”副本之间的区别。
因此,例如,在下面的列表中,长度大于 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']
^
...
