Ответ 1
В принципе, список реализует метод __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
.