为什么列表有一个__reverse __()特殊方法,但元组不在Python中?

时间:2016-05-23 13:43:28

标签: python list tuples python-internals c-api

Python中内置的reversed(seq)表示seq必须具有__reversed__()方法或支持序列协议。列表和元组显然都支持序列协议,但列表使用了自己的__reversed__()方法。

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

然后,__reverse__()对于列表必须有一些比序列协议提供的反向更快的优化。所以我查看了source code where __reversed__() is implemented的listobject.c,并且凭借我可怜的C知识,我无法理解为什么元组(tupleobject.c)没有类似的内部反转方法,因为元组出现了在分配和内存上对bean进行一些优化(PyTuple_MAXSAVESIZE)的bean数组,以及一个更熟悉的数组列表。

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

1 个答案:

答案 0 :(得分:4)

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

因为元组是异类,所以列表同质;虽然列表有顺序,但元组意味着结构。结果,元组意味着相对,而列表可能(非常)大。见What's the difference between lists and tuples?

因此,根本不需要为元组创建反向迭代器;这将是一个过早的优化,创造一个维持成本,收益很少。