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

wim*_*wim 17 python python-internals reverse-iterator

反转元组并反转列表会返回不同类型的对象:

>>> reversed((1,2))
<reversed at 0x7fffe802f748>
>>> reversed([1,2])
<list_reverseiterator at 0x7fffebdd4400>
Run Code Online (Sandbox Code Playgroud)

他们也一样dir.这两种类型都不是另一种类型的子类.

这是为什么?一个人可以做什么,另一个不能?

jsb*_*eno 12

基本上,列表实现该__reversed__方法并返回一个专用对象,同时tuple回退到reversed任何序列的默认实现:

>>> list.__reversed__
<method '__reversed__' of 'list' objects>
>>> tuple.__reversed__
AttributeError: type object 'tuple' has no attribute '__reversed__'
Run Code Online (Sandbox Code Playgroud)

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

实际上看C代码,没有什么区别,当然没有任何东西吸引眼球 -

我敢说特殊列表__reversed__实现是Python2天的剩余部分,它 reversed 实际上会将任何其他Python序列复制到list- 所以其他序列没有任何意义可以为它设置特殊情况(当它们确实实现了enumreverse它时)对于元组来说已经足够好了.

我很确定如果只是简单地注释掉 __reversed__插槽listobject.c,Python及其列表就会好像没有发生任何事情,默认为一般情况reversed.

  • **Github pro-tip**:如果您链接到blob/master中的行号,那么一旦文件被修改,链接就会腐烂.而是选择所需的行,然后按"y"键将链接固定到特定的提交.然后,行号永远不会偏离相关代码.我已经更新了你答案中的链接. (5认同)
  • 默认反转:https://github.com/python/cpython/blob/master/Objects/enumobject.c#L230 list颠倒:https://github.com/python/cpython/blob/master/Objects/listobject.c #L2823 (3认同)
  • 一个人可以做什么,另一个不能? (3认同)

His*_*ram 5

根据 Python 的文档

object.__reversed__(self)

reversed()内置函数调用(如果存在)以实现反向迭代。它应该返回一个新的迭代器对象,该对象以相反的顺序迭代容器中的所有对象。

如果__reversed__()未提供该方法,则reversed() 内置函数将回退到使用序列协议(__len__()__getitem__())。支持序列协议的对象只有__reversed__()在它们能够提供比 reversed().

  • list 有一个更有效的实现可用,这似乎很奇怪,但 tuple 没有。 (3认同)