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

>>> reversed((1,2))
<reversed at 0x7fffe802f748>
>>> reversed([1,2])
<list_reverseiterator at 0x7fffebdd4400>

它们具有相同的dir。两种类型都不是另一种的子类。

这是为什么?一个人能做什么而另一个人不能做?

最佳答案

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

>>> list.__reversed__
<method '__reversed__' of 'list' objects>
>>> tuple.__reversed__
AttributeError: type object 'tuple' has no attribute '__reversed__'

现在,为什么必须在列表对象本身的源代码中找到list并非默认为序列reversed对象的原因-可能它可以通过直接访问一些内部list属性来启用一些优化。

实际上看一下C代码,几乎没有什么区别,当然也没有什么值得关注的-
  • default reversed
  • list reversed

  • 我敢说特殊列表__reversed__的实现是Python2天的剩余时间,在那里reversed实际上会将任何其他Python序列复制到list-因此,其他序列也没有特殊情况(以及它们何时实现)是没有意义的一般的enumreverse,对于元组就足够了)。

    我非常确定,如果只是简单地注释掉__reversed__上的listobject.c插槽,Python及其列表将像什么都没有发生一样工作,默认为reversed

    关于python - 元组和列表反向之间有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40165800/

    10-11 20:30