Почему у списков есть специальный метод __reverse__(), а в Python кортежей нет?
reversed(seq)
встроенный в Python указывает, чтоseq
должен иметь__reversed__()
метод или поддержка протокола последовательности. Списки и кортежи, очевидно, поддерживают протокол последовательности, но списки имеют свои собственные __reversed__()
метод используется вместо
>>> hasattr(list, '__reversed__')
True
>>> hasattr(tuple, '__reversed__')
False
Тогда должна быть более быстрая оптимизация в__reverse__()
для списка, чем протокол последовательности обеспечил бы для обращения. Итак, я взглянул на исходный код, где __reversed__()
реализован для listobject.c, и из-за моих весьма ограниченных знаний C я не могу понять, почему кортеж ( tupleobject.c) не имеет подобных внутренних методов реверсирования, так как мне кажется, что кортеж - это bean-массив с некоторыми оптимизациями (PyTuple_MAXSAVESIZE
) на распределение и память, и список, чтобы быть более знакомым массивом.
Какая магия C мне не хватает, что делает реализацию __reversed__()
метод оптимизации для типа списка, но стандартный протокол итератора лучше для кортежей?
1 ответ
Кортежи просто редко повторяются в обратном порядке.
Это потому, что кортежи разнородны, списки однородны; в то время как списки имеют порядок, кортежи должны иметь структуру. В результате, кортежи должны быть относительно маленькими, а списки могут быть (очень) большими. См. В чем разница между списками и кортежами?
Таким образом, просто нет необходимости создавать обратный итератор для кортежей; это было бы преждевременной оптимизацией, создающей затраты на техническое обслуживание за очень небольшой выигрыш