【问题标题】:Why do lists have a __reverse__() special method but tuples don't in Python?为什么列表有 __reverse__() 特殊方法但元组在 Python 中没有?
【发布时间】:2016-09-20 10:23:35
【问题描述】:

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

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

那么__reverse__() 中的列表必须比序列协议提供的逆向优化更快。因此,我查看了 listobject.c 的source code where __reversed__() is implemented,由于我对 C 的知识有限,我无法理解为什么元组 (tupleobject.c) 没有类似的内部反转方法,因为元组在我看来是 bean对分配和内存进行了一些优化 (PyTuple_MAXSAVESIZE) 的数组,以及一个更熟悉的数组列表。

我缺少什么使实现__reversed__() 方法成为列表类型优化的C 魔法,但标准迭代器协议更适合元组?

【问题讨论】:

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


    【解决方案1】:

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

    这是因为元组是异类的,列表是同质的;虽然列表有顺序,但元组应该有结构。因此,元组应该相对,而列表可能(非常)大。见What's the difference between lists and tuples?

    因此,根本不需要为元组创建反向迭代器;这将是一个过早的优化,只会产生很少的维护成本。

    【讨论】:

    • 啊,所以我认为它是对 not 元组的 __reversed__() 方法的优化,但这实际上只是不值得实施的问题,不是由于某种原因,甚至考虑到这一点,立即想到了优化。谢谢!
    猜你喜欢
    • 2011-04-21
    • 2012-01-04
    • 1970-01-01
    • 2014-09-05
    • 1970-01-01
    • 2019-12-07
    • 2013-06-01
    相关资源
    最近更新 更多