删除列表项对 python 中 reversed() 的影响

Sor*_*ary 8 python list python-3.x

据我所知,reversed()function 提供了一个迭代器,其工作方式与此类似,iter()但会以相反的顺序提供项目。但是,我遇到了从reversed()函数中返回的对象的奇怪行为。

通过查看:

lst = ['a', 'b', 'c', 'd']
iter_lst = iter(lst)
lst.remove('c')
print(list(iter_lst))
Run Code Online (Sandbox Code Playgroud)

输出 : ['a', 'b', 'd']

正如预期的那样。但:

lst = ['a', 'b', 'c', 'd']
rev_iter_lst = reversed(lst)
lst.remove('c')
print(list(rev_iter_lst))
Run Code Online (Sandbox Code Playgroud)

输出 : []

不应该是:['d', 'b', 'a']

是否__reversed__()在列表对象中的方法或__next__()迭代器对象中的方法实现中阻止了这种情况?我的意思是如果原始列表中的某些内容发生变化,它可能不会产生反向序列......

更新:我已经张贴的答案,是一个可能的修复它在这里,我测试过这一点,但我不知道是否有一种情况,这种实现将给予相应稳固的结果。

Kas*_*a K 5

根据list.__reversed__ 源代码,迭代器记住最后一个索引地址,并返回记住最后一个索引地址的迭代器。现在,当您删除一个项目时,它将移动所有索引并使最后一个地址指向任何地方,它将返回一个空列表,因为没有任何内容可以迭代。让我描述更多:考虑以下列表:lst = ['a','b','c'] 还假设lst[0]在 100 处,每个字符是一个字节,因此,字符'c'在 102 中。当您创建受尊敬的迭代器时,它会记住 102 作为起点。在下一步中,我们'b'现在省略字符'c'在地址 101 中。当您要求迭代器进行迭代时,它将开始查看位置 102。它将在那里找到什么?字面上什么都没有,显然它会返回一个空列表。

我希望这会有所帮助:)

编辑:字地址不正确。我必须改用索引...