Python 中的reversed(seq)
内置表示seq
必须有__reversed__()
方法或支持序列协议。列表和元组显然都支持序列协议,但列表使用了自己的__reversed__()
方法。
>>> hasattr(list, '__reversed__')
True
>>> hasattr(tuple, '__reversed__')
False
那么__reverse__()
列表的优化必须比序列协议为反转提供的更快。因此,我查看了为 listobject.c实现的源代码__reversed__()
,并且由于我对 C 知识的有限性,我无法理解为什么元组 ( tupleobject.c ) 不会有类似的内部反转方法,因为元组在我看来在分配和内存方面进行一些优化 ( PyTuple_MAXSAVESIZE
) 的 bean 数组,以及一个更熟悉的数组列表。
我缺少什么使实现__reversed__()
方法成为列表类型优化的 C 魔法,但标准迭代器协议更适合元组?