为什么Python中的元组可以反转但没有__reversed__?

kuz*_*roo 4 python reverse iterator tuples immutability

在讨论这个答案时,我们意识到元组没有__reversed__方法.我的猜测是创建迭代器需要改变元组.然而元组玩得很好reversed.为什么不能将这种方法用于reversed工作__reversed__呢?

>>> foo = range(3)
>>> foo
[0, 1, 2]
>>> list(foo.__reversed__())
[2, 1, 0]
>>> foo
[0, 1, 2]
>>> bar = (0, 1, 2)
>>> list(bar.__reversed__())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute '__reversed__'
>>> reversed(bar)
<reversed object at 0x10603b310>
>>> tuple(reversed(bar))
(2, 1, 0)
Run Code Online (Sandbox Code Playgroud)

alf*_*sin 9

根据规格:

逆转(SEQ)

返回反向迭代器.seq必须是一个具有reversed()方法的对象, 或者支持序列协议(__len __()方法和__getitem __()方法,整数参数从0开始).

  • 至关重要的是[__reversed__`]部分(https://docs.python.org/2/reference/datamodel.html#object.__reversed__)说:"支持序列协议的对象应该只提供__reversed __()可以提供比reverse()提供的实现更高效的实现." (3认同)