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

帅比萌擦擦* 提交于 2019-11-30 17:19:40
jsbueno

Basically, a list implements the __reversed__ method and returns an specialized object, while tuple falls back to the default implementation of reversed for any sequence:

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

Now, why list does not default to the sequence reversed object has to be found in the source code for the list object itself - probably it enables some optimizations by accessing directly some of internal list attributes.

Actually looking at the C code, there is little difference, and certainly nothing that catches the eye -

I'd dare say the special list __reversed__ implementation is a leftover from Python2 days where reversed would actually copy any other Python sequence to a list - so there would be no sense for other sequences to have special cases for it (and when they did implement the general enumreverse it was just good enough for tuples).

I am pretty sure that if one would simply comment out the __reversed__ slot on listobject.c, Python and its lists would work as if nothing had happened, defaulting to the general case reversed.

Hisham Karam

According to Python's 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().

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!