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__()
方法实现了列表类型的优化,但标准迭代器协议更适合元组?
答案 0 :(得分:4)
元组很少以相反的顺序迭代。
因为元组是异类,所以列表同质;虽然列表有顺序,但元组意味着结构。结果,元组意味着相对小,而列表可能(非常)大。见What's the difference between lists and tuples?
因此,根本不需要为元组创建反向迭代器;这将是一个过早的优化,创造一个维持成本,收益很少。