我知道这是一个你永远不应该编写的代码示例,而且我并没有要求采用正确的方法。我担心的是我不了解它的行为,所以我希望有人可以解释它:
def foo(list_of_chars):
'''Returns the set of words that can be obtained by removing one character from list_of_chars.'''
result = set()
my_copy = list(list_of_chars)
for elem in my_copy:
my_copy.remove(elem)
result.add(''.join(my_copy))
my_copy = list(list_of_chars)
return result
我原本期望这个函数的行为(让我们说list_of_chars
是['h', 'e', 'l', 'l', 'o']
):
my_copy
,所以当for
循环将下一个元素分配给elem时,它就像我们从未触及列表一样(所以我们会反复思考' h,'' l',' l',' o') ; 实际发生的事情是陌生人:我们遍历' h,' l',' l',' o',所以& #39; E'被跳过,但它是唯一被跳过的字符。其他示例的行为方式相同:只忽略list_of_chars
的第二个元素。有人可以解释一下吗? (Python 2和3产生相同的结果)。
答案 0 :(得分:4)
for
循环在每次迭代时都不会再次“读取”my_copy
,但my_copy.remove
会这样做。
for elem in my_copy:
my_copy.remove(elem)
在第一次迭代中,两行中的my_copy
引用同一个对象。您实际上正在修改对象for
迭代。但是,在迭代结束时,您将my_copy
替换为其他内容。 for
循环保留其原始对象引用,但my_copy.remove
引用my_copy
的当前版本。所以现在for
循环迭代的对象和你remove
元素的对象是两个不同的对象。
因此remove
仅在第一次迭代时干扰循环。