Python的相对新手。我试图编写一个函数来比较两个列表并删除任何重复的值:
>>> michael = ['Fox', 'Jackson', 'Jordan']
>>> not_michael = ['Smith', 'Brown', 'Jordan', 'Fox']
>>> result = michael_remover(michael, not_michael)
>>> result
['Smith', 'Brown']
然而,这是我一直得到的:
>>>result
['Smith', 'Brown', 'Fox']
这是我原来的功能代码:
def michael_remover(michael, not_michael):
for name in not_michael:
if name in michael:
not_michael.remove(name)
return not_michael
我最终改写了这个函数,并且按照预期工作:
def michael_remover(michael, not_michael):
not_michael_2 = [name for name in not_michael if name not in michael]
return not_michael2
然而,我很好奇为什么我的原始代码不起作用。谁能纠正/解释?它在我的大脑尖端,但我无法用语言表达...谢谢
答案 0 :(得分:3)
您在迭代时更改列表。这会导致您看到的意外行为。在内部,for循环会跟踪您所在的索引。删除项目时,不处理下一个项目,因为它的索引现在是您刚刚处理的索引。
列表推导有效,因为它创建了一个新列表,而不是修改现有列表。因此它处理每个元素,并按预期工作。