2016-05-23 39 views
2

Python中内置的reversed(seq)表示seq必须具有__reversed__()方法或支持序列协议。列表和元组都明显支持顺序协议,但是列表有自己的__reversed__()方法。为什么列表有一个__reverse __()特殊方法,但元组不在Python中?

>>> hasattr(list, '__reversed__') 
True 
>>> hasattr(tuple, '__reversed__') 
False 

那么就必须在__reverse__()比对序列协议将为扭转名单快了一些优化。于是我带着一看source code where __reversed__() is implemented为listobject.c,并与我的可怜有限Ç的知识,我不明白为什么一个元组(tupleobject.c)不会有类似的内部倒车方法,作为一个元组,在我看来豆阵列与一些优化(PyTuple_MAXSAVESIZE)分配和内存,列表是一个更熟悉的数组。

什么是我错过的C魔法,使实现__reversed__()方法优化列表类型,但标准迭代器协议更好的元组?

回答

4

元组很少以相反的顺序迭代。

这是因为元组是异质,名单是同质;而列表有秩序,元组意味着有结构。作为结果,元组是为了比较,而列表可以是(非常)大。见What's the difference between lists and tuples?

因此,根本就没有必要创建一个元组一个反向迭代;这将是一个过早的优化,造成很少收益的维护成本。

+0

啊,所以我把它看作一个优化_not_有一个'__reversed __()'方法元组,但它实际上只是一个不被价值实现的事情,甚至没有考虑,由于某些原因,立刻想到优化。谢谢! –

相关问题