• Jobs
  • About Us
  • professionals
    • Home
    • Jobs
    • Courses and challenges
  • business
    • Home
    • Post vacancy
    • Our process
    • Pricing
    • Assessments
    • Payroll
    • Blog
    • Sales
    • Salary Calculator

0

179
Views
¿Por qué salir de la lista original hace que la lista inversa (original_list) esté vacía?

Tengo el siguiente código:

 s = [1,2,3] t = reversed(s) for i in t: print(i) # output: 3,2,1

Si saco un elemento de s (original), entonces la t (invertida) se vacía:

 s = [1,2,3] t = reversed(s) s.pop() for i in t: print(i) # expected output: 2, 1 # actual output (nothing):

¿Por qué pasó esto?

over 3 years ago · Santiago Trujillo
2 answers
Answer question

0

la llamada reversed devuelve un iterador sobre esa lista, que es un objeto especial que le permite iterar en orden inverso sobre la lista original, no es una lista nueva y solo se usa una vez

 >>> s= [1,2,3] >>> t = reversed(s) >>> t <list_reverseiterator object at 0x00000261BE8F0C40> >>> list(t) [3, 2, 1] >>> list(t) [] >>>

y debido a que este iterador hace referencia a la lista original, cualquier cambio en él se refleja cuando itera sobre el iterador más adelante.

Actualizar

En particular, y como explica MZ, si ese cambio es tal que el estado de la lista es diferente de cuando se creó el iterador, no obtiene nada si el tamaño disminuye o una versión incompleta de la lista si aumenta

 >>> s= [1,2,3] >>> t = reversed(s) >>> s.insert(0,23) >>> s [23, 1, 2, 3] >>> list(t) [2, 1, 23] >>> t = reversed(s) >>> s.append(32) >>> list(t) [3, 2, 1, 23] >>> s [23, 1, 2, 3, 32] >>> t = reversed(s) >>> s.pop() 32 >>> list(t) [] >>>
over 3 years ago · Santiago Trujillo Report

0

Echando un vistazo al código cpython en GitHub , podemos intuir por qué ya no funciona.

El iterador que se devuelve esencialmente requiere conocer la posición del último índice y la longitud de la matriz. Si se cambia el tamaño de la matriz, el iterador ya no funcionará.

Prueba 1: aumentar la longitud de la matriz

Esto tampoco producirá los resultados correctos, pero el iterador se ejecuta:

 s = [1,2,3] t = reversed(s) s.append(4) for i in t: print(i) # output: [3, 2, 1]

Prueba 2: Disminuir, luego aumentar la longitud

 s = [1,2,3] t = reversed(s) s.pop() s.append(4) for i in t: print(i) # output: [4, 2, 1]

¡Aún funciona!

Entonces, hay una verificación interna para ver si el último índice sigue siendo válido o no, y si lo es, es un ciclo for simple hasta el índice 0.

Si no funciona, el iterador regresa vacío.

over 3 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Our process Sales
Legal
Terms and conditions Privacy policy
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recommend me some offers
I have an error