为啥列表有 __reverse__() 特殊方法但元组在 Python 中没有?

Posted

技术标签:

【中文标题】为啥列表有 __reverse__() 特殊方法但元组在 Python 中没有?【英文标题】: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 魔法,但标准迭代器协议更适合元组?

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

啊,所以我认为它是对 not 元组的 __reversed__() 方法的优化,但这实际上只是不值得实施的问题,不是由于某种原因,甚至考虑到这一点,立即想到了优化。谢谢!

以上是关于为啥列表有 __reverse__() 特殊方法但元组在 Python 中没有?的主要内容,如果未能解决你的问题,请参考以下文章

python中的__iter__ __reversed__ __next__

特殊成员方法

python操作符重载特殊方法列表

HDU - 6513 Reverse It (SYSU校赛C题)(组合数学+容斥)

在以下情况下需要实现__new__方法的帮助

Python中类的特殊属性和魔术方法