Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 反向元组和反向列表之间有什么区别?_Python_Python Internals_Reverse Iterator - Fatal编程技术网

Python 反向元组和反向列表之间有什么区别?

Python 反向元组和反向列表之间有什么区别?,python,python-internals,reverse-iterator,Python,Python Internals,Reverse Iterator,反转元组和反转列表将返回不同类型的对象: >>> reversed((1,2)) <reversed at 0x7fffe802f748> >>> reversed([1,2]) <list_reverseiterator at 0x7fffebdd4400> 它们有相同的目录。这两种类型都不是另一种类型的子类 为什么呢?一个可以做什么而另一个不能做什么?基本上,列表实现了uuu reversed uuu方法并返回一个专门的对象,而t

反转元组和反转列表将返回不同类型的对象:

>>> reversed((1,2))
<reversed at 0x7fffe802f748>
>>> reversed([1,2])
<list_reverseiterator at 0x7fffebdd4400>
它们有相同的目录。这两种类型都不是另一种类型的子类


为什么呢?一个可以做什么而另一个不能做什么?

基本上,列表实现了uuu reversed uuu方法并返回一个专门的对象,而tuple则返回到任何序列的默认实现reversed:

>>> list.__reversed__
<method '__reversed__' of 'list' objects>
>>> tuple.__reversed__
AttributeError: type object 'tuple' has no attribute '__reversed__'
现在,必须在list对象本身的源代码中找到为什么list不默认为sequence reversed对象-可能它通过直接访问一些内部list属性来实现一些优化

实际上,看看C代码,没有什么区别,当然也没有什么引人注目的地方-

我敢说,特殊的list _ureversed _uu实现是Python2时代的遗留物,在Python2时代,reversed实际上会将任何其他Python序列复制到一个列表中——因此其他序列对它有特殊情况是没有意义的,当他们实现了一般的enumreverse时,它对元组来说已经足够好了

我非常确信,如果你简单地注释掉listobject.c上的uu reversed uuu插槽,Python及其列表将像什么都没有发生一样工作,默认情况下是颠倒的。

根据Python的:

对象。\u\u反转\u\u self

如果反向内置程序存在,则调用以实现反向 迭代。它应该返回一个新的迭代器对象,该对象在 容器中的所有对象按相反顺序排列

如果未提供_反向_方法,则反向 内置将退回到使用序列协议__ 和uu getitem。支持序列协议的对象 如果他们能够提供 比 颠倒过来


默认反转:列表反转:一个可以做什么而另一个不能?Github pro提示:如果像这样链接到blob/master中的行号,链接会在文件修改后立即损坏。相反,选择所需的行,然后按y键,将链接固定到特定提交。然后行号将永远不会偏离相关代码。我已更新了您答案中的链接。@wim谢谢。直到“y”。我知道链接腐烂,但总是手工提交。是否有任何理由使用不同的迭代器,因为列表可能是可变的?奇怪的是,列表会有一个更有效的实现,但是tuple没有。除非您使用的是较旧版本的python,您可以在listreverseiterator上调用len,否则在bar性能上似乎没有什么区别。