Hasta donde yo sé, la función reversed() da un iterador y funciona igual que iter() pero dará los elementos en orden inverso. Sin embargo, enfrenté un comportamiento extraño del objeto que regresa de la función reversed() .
Al mirar:
lst = ['a', 'b', 'c', 'd'] iter_lst = iter(lst) lst.remove('c') print(list(iter_lst)) salida: ['a', 'b', 'd']
Es tal como se esperaba. pero:
lst = ['a', 'b', 'c', 'd'] rev_iter_lst = reversed(lst) lst.remove('c') print(list(rev_iter_lst)) salida: []
¿No debería ser: ['d', 'b', 'a'] ?
¿Es algo en la implementación del __reversed__() en el objeto de lista o __next__() en el objeto iterador que evita esto? Quiero decir, si algo cambia en la lista original, tal vez no producirá una secuencia inversa ...
Actualización : publiqué una respuesta que es una posible solución aquí , lo probé pero no sé si hay una situación en la que esta implementación daría un resultado no exceptuado.
de acuerdo con el código fuente list.__reversed__ , el iterador recuerda la última dirección de índice y devuelve el iterador que recuerda la última dirección de índice. ahora, cuando elimine un elemento, cambiará todos los índices y hará que la última dirección no apunte a ninguna parte y devolverá una lista vacía porque no hay nada sobre lo que iterar. déjame describir más: considera la siguiente lista: lst = ['a','b','c'] también supongamos que lst[0] está en el 100 y cada carácter es un byte, por lo que el carácter 'c' está en el 102. cuando crea un iterador venerado, recordará 102 como el punto de inicio. en el siguiente paso, omitimos 'b' ahora el carácter 'c' está en la dirección 101. y cuando le pida al iterador que itere, comenzará a buscar en la posición 102. ¿Qué encontrará allí? literalmente nada y obviamente devolverá una lista vacía.
Espero que esto pueda ser útil :)
EDITAR: la palabra dirección no es correcta. Debo usar el índice en su lugar ...
La llamada a la list iterará el iterador inverso, cuya index < PyList_GET_SIZE(seq) seq fallará porque redujo la secuencia mientras tanto, y por lo tanto no producirá un valor sino que se detendrá:
listreviter_next(listreviterobject *it) { (some checks) index = it->it_index; if (index>=0 && index < PyList_GET_SIZE(seq)) { (decrease the index and return the element) } (stop the iteration) }