gpt4 book ai didi

python - 为什么列表有一个 __reverse__() 特殊方法而元组在 Python 中没有?

转载 作者:行者123 更新时间:2023-11-28 22:36:29 24 4
gpt4 key购买 nike

reversed(seq) Python 中的built-in 表示seq 必须有一个__reversed__() 方法或支持序列协议(protocol)。列表和元组显然都支持序列协议(protocol),但列表有自己的 __reversed__() 方法来代替。

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

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

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

最佳答案

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

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

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

关于python - 为什么列表有一个 __reverse__() 特殊方法而元组在 Python 中没有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37392668/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com