reversed(seq)
встроенный в Python указывает, что seq
должен иметь метод __reversed__()
или поддерживать протокол последовательности. Списки и кортежи, очевидно, поддерживают протокол последовательности, но в списках используется собственный метод __reversed__()
.Почему у списков есть специальный метод __reverse __(), но кортежи не находятся в Python?
>>> hasattr(list, '__reversed__')
True
>>> hasattr(tuple, '__reversed__')
False
Тогда должен быть какой-быстрее оптимизации в __reverse__()
для списка, чем протокол последовательности обеспечит реверса. Поэтому я взглянул на source code where __reversed__()
is implemented на listobject.c и с моим жалким ограничением знаний C я не понимаю, почему кортеж (tupleobject.c) не будет иметь подобных внутренних методов реверсирования, поскольку кортеж представляется мне в bean-массив с некоторыми оптимизациями (PyTuple_MAXSAVESIZE
) о распределениях и памяти, а список - более знакомый массив.
Что такое C-магия, которую я пропускаю, что делает реализацию метода __reversed__()
оптимизацией для типа списка, но стандартный протокол итератора лучше для кортежей?
Ага, поэтому я рассматривал его как оптимизацию для _not_ для 't___ метода' __reversed __() 'для кортежей, но на самом деле это просто вопрос не стоило реализовывать, даже не считал, что по какой-то причине сразу подумал оптимизация. Благодаря! –