反向元组和反向列表有什么区别?
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()
.
反转元组和反转列表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, thereversed()
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 byreversed()
.