我想检查列表中是否有多个单词。我写了以下代码:
for word in words:
word = words.pop(0)
try:
index = words.index(word)
if word == words[index]:
return False
except ValueError:
continue
这个想法是从列表中删除列表的第一个单词,并检查它是否存在于剩余列表中。 但是这不起作用,因为循环只会迭代列表的前半部分。
如果我将第一行更改为以下内容:
for word in words[:]:
它按预期工作。我在python文档中读到了shallow copy,因为在SO问题的评论中提到了我,我发现了words[:]
方法。但是我仍然不明白为什么第一种方法不起作用而第二种方法不起作用。
我想对两个版本的差异做一些解释,如果可能的话,还有一些关于python如何在for循环中引用/引用列表的信息。
编辑: 戳给我指出this SO answer,它很好地解释了初始方法的行为。
我没有意识到的是[:]给了我一份我正在迭代的列表副本。基本上我正在迭代副本但修改原始列表。