Подтвердить что ты не робот

Какая разница между обратным кортежем и перевернутым списком?

Реверсирование кортежа и обращение к списку возвращают объекты другого типа:

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

Они имеют одинаковый dir. Ни один из них не является подклассом другого.

Почему? Что можно сделать, чтобы другой не мог?

4b9b3361

Ответ 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.

Ответ 2

В соответствии с Python документация:

object.__reversed__(self)

Вызывается (если присутствует) встроенным reversed(), чтобы реализовать обратное итерация. Он должен возвращать новый объект итератора, который выполняет итерацию все объекты в контейнере в обратном порядке.

Если метод __reversed__() не указан, reversed()встроенный будет возвращаться к использованию протокола последовательности (__len__()и __getitem__()). Объекты, поддерживающие протокол последовательности должен предоставлять только __reversed__(), если они могут обеспечить более эффективная, чем та, reversed().