reverse实际上反转了Python迭代器吗?

2024-04-27 00:30:56 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

[3, 2, 1, 0]

我假设这只是将getitem从索引len(...)-1调用到{}。但我也不能这样做:

^{pr2}$

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


Tags: 元素列表lendocumentationlistgetitemxrangepr2
3条回答

reversed()只有在使用泛型迭代器时才能获取序列,如果不耗尽迭代器并存储所有值,则无法知道最终值是什么。在

幸运的是,xrange返回一个作为序列工作的xrange对象:

>>> x = xrange(10)
>>> len(x)
10
>>> x[9]
9

它也碰巧有一个实际的__reversed__方法,但这是拥有所有序列方法的一个特例。在

reversed()在对象上查找^{} special method。列表对象提供了此功能,xrange()

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

迭代器对象只是反向生成值,不生成列表对象。在

对于不实现__reversed__的对象,reversed()函数使用长度和__getitem__方法;例如reversed()本质上等同于:

^{pr2}$

其中第二部分是生成器表达式,计算比较迟缓。然后生成器依次从索引(长度-1)开始访问每个项,一直到索引0。在

比较一下这两者:

In [2]: reversed(xrange(4))
Out[2]: <rangeiterator at 0x7fa83291bde0>

In [3]: list(reversed(xrange(4)))
Out[3]: [3, 2, 1, 0]

In [4]: reversed([0,1,2,3])
Out[4]: <listreverseiterator at 0x7fa8328be2d0>

In [5]: list(reversed([0,1,2,3]))
Out[5]: [3, 2, 1, 0]

相关问题 更多 >