因此,我可以在列表上创建一个反向迭代器:

list(reversed([0,1,2,3]))

[3, 2, 1, 0]

我假设这只是从索引getitemlen(...)-1调用0。但是后来我也不能这样做:
list(reversed(xrange(4)))

[3, 2, 1, 0]

现在我有点困惑。这会从xrange(4)创建列表,然后将其反转吗?如果不是,它如何知道最后一个元素是什么以及如何向后退?我读了documentation,但没有帮助。

最佳答案

reversed()在对象上寻找 __reversed__ special method。列表对象提供了此功能,xrange()也提供了此功能:

>>> xrange(4).__reversed__()
<rangeiterator object at 0x106e2fa50>

迭代器对象只是产生相反的值,而不会产生列表对象。

对于未实现__reversed__的对象,reversed()函数使用length和__getitem__方法;例如reversed()本质上等效于:
def reversed(seq):
    try:
        return seq.__reversed__()
    except AttributeError:
        return (seq[i] for i in xrange(len(seq) - 1, -1 , -1))

其中第二部分是生成器表达式,它的计算是惰性的。然后,生成器依次访问每个项目,从索引(长度-1)一直到索引0。

关于python - 反向是否真的反向了Python迭代器?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25138142/

10-10 15:18