反向元组和反向列表有什么区别?

What's the difference between a reversed tuple and a reversed list?

反转元组和反转列表returns 不同类型的对象:

>>> reversed((1,2))
<reversed at 0x7fffe802f748>
>>> reversed([1,2])
<list_reverseiterator at 0x7fffebdd4400>

他们有相同的dir。两种类型都不是另一种类型的子类。

这是为什么?有什么是一个人能做到另一个人做不到的?

基本上,列表实现 __reversed__ 方法和 returns 一个专门的对象,而 tuple 回退到任何序列的 reversed 默认实现:

>>> list.__reversed__
<method '__reversed__' of 'list' objects>
>>> tuple.__reversed__
AttributeError: type object 'tuple' has no attribute '__reversed__'

现在,为什么列表不默认为序列 reversed 对象必须在列表对象本身的源代码中找到 - 可能它通过直接访问一些内部 list属性。

实际看C代码,差别不大,肯定没有什么吸引眼球的-

我敢说特殊列表 __reversed__ 实现是 Python2 天的遗留物,其中 reversed 实际上会将任何其他 Python 序列复制到 list - 所以对于其他序列来说没有特殊情况是没有意义的(当他们确实实现了通用 enumreverse 时,它对元组来说已经足够好了)。

我很确定,如果简单地注释掉 listobject.c 上的 __reversed__ 插槽,Python 及其列表将像什么都没发生一样工作,默认为一般案例 reversed.

根据Python的documentation

object.__reversed__(self)

Called (if present) by the reversed() built-in to implement reverse iteration. It should return a new iterator object that iterates over all the objects in the container in reverse order.

If the __reversed__() method is not provided, the reversed() built-in will fall back to using the sequence protocol (__len__() and __getitem__()). Objects that support the sequence protocol should only provide __reversed__() if they can provide an implementation that is more efficient than the one provided by reversed().