В принципе, список реализует метод __reversed__
и возвращает специализированный объект, в то время как tuple
возвращается к реализации по умолчанию reversed
для любой последовательности:
>>> list.__reversed__
<method '__reversed__' of 'list' objects>
>>> tuple.__reversed__
AttributeError: type object 'tuple' has no attribute '__reversed__'
Теперь, почему список не по умолчанию последовательности reversed
объект должен быть найден в исходном коде самого объекта списка - возможно, он позволяет некоторые оптимизации, напрямую обращаясь к некоторым внутренним атрибутам list
.
На самом деле, глядя на код C, есть небольшая разница, и, конечно, ничего такого, что бросается в глаза -
я осмелюсь сказать, специальный список __reversed__
реализация остается от Python2 дней, когда reversed
фактически скопировал бы любую другую последовательность Python в list
- так что не было бы смысла для других секторов чтобы иметь для него особые случаи (и когда они реализовали общий enumreverse
, это было просто достаточно для кортежей).
Я уверен, что если один просто закомментируйте слот __reversed__
на listobject.c
, Python и его списки будут работать так, как будто ничего не произошло, по умолчанию в общем случае reversed
.
Кажется, что нет производительности разностных баров, если вы не используете более старую версию python, где вы могли бы назвать len на listreverseiterator. http://bugs.python.org/issue3689. –