tuplas - más de 400 ejercicios de programación en python pdf
¿Cuál es la diferencia entre una tupla invertida y una lista invertida? (2)
Invertir una tupla y revertir una lista devuelve objetos de diferente tipo:
>>> reversed((1,2))
<reversed at 0x7fffe802f748>
>>> reversed([1,2])
<list_reverseiterator at 0x7fffebdd4400>
Tienen la misma dir
. Ningún tipo es una subclase de la otra.
¿Porqué es eso? ¿Qué puede uno hacer que el otro no puede?
Básicamente, una lista implementa el método __reversed__
y devuelve un objeto especializado, mientras que tuple
__reversed__
a la implementación predeterminada de reversed
para cualquier secuencia:
>>> list.__reversed__
<method ''__reversed__'' of ''list'' objects>
>>> tuple.__reversed__
AttributeError: type object ''tuple'' has no attribute ''__reversed__''
Ahora, el motivo por el que la lista no se establece de forma predeterminada en la secuencia reversed
se debe encontrar en el código fuente del propio objeto de la lista; es probable que habilite algunas optimizaciones accediendo directamente a algunos de los atributos de la list
interna.
En realidad, mirando el código C, hay poca diferencia, y ciertamente nada que llame la atención.
Me atrevería a decir que la implementación de __reversed__
lista especial es un remanente de Python2 días en los que reversed
realidad copiaría cualquier otra secuencia de Python a una list
, por lo que no tendría sentido que otras secuencias tuvieran casos especiales (y cuándo se implementaron). el enumreverse
general era suficiente para tuplas).
Estoy bastante seguro de que si uno simplemente comentara el espacio __reversed__
en listobject.c
, Python y sus listas funcionarán como si nada hubiera pasado, por defecto al caso general reversed
.
Según la documentation de Python:
object.__reversed__(self)
Llamado (si está presente) por el
reversed()
incorporado para implementar la iteración inversa. Debe devolver un nuevo objeto iterador que se repite en todos los objetos del contenedor en orden inverso.Si no se proporciona el método
__reversed__()
, la funciónreversed()
retrocederá al uso del protocolo de secuencia (__len__()
y__getitem__()
). Los objetos que admiten el protocolo de secuencia solo deben proporcionar__reversed__()
si pueden proporcionar una implementación que sea más eficiente que la proporcionada porreversed()
.