Python: llamar a ‘lista’ en un objeto de mapa dos veces

Quería calcular la sum de los cuadrados hasta n. Diga n es 4. Entonces este código genera una lista de un objeto de mapa en el rango de 0 a 4:

m = map(lambda x: x**2, range(0,4)) 

Facilidad suficiente. Ahora llame a la lista en m, y luego sume:

 >>> sum(list(m)) 14 

El comportamiento inesperado es que si vuelvo a ejecutar la última línea, la sum es 0:

 >>> sum(list(m)) 0 

Sospecho que esto se debe a que la list(m) llamadas list(m) devuelve una lista vacía, pero no puedo encontrar una explicación para este comportamiento. ¿Alguien me puede ayudar con esto?

Related of "Python: llamar a ‘lista’ en un objeto de mapa dos veces"

map devuelve un iterador con estado en Python 3. Los iteradores con estado solo se pueden consumir una vez, después de eso se agotan y no generan valores.

En tu fragmento de código consumes el iterador varias veces. list(m) cada vez que intenta recrear la lista, y para la segunda y la próxima ejecución, la lista creada siempre estará vacía (ya que el iterador de origen se consumió en la primera operación de list(m) ).

Simplemente convierta iterador a lista una vez, y opere en dicha lista después.

 m = map(lambda x: x**2, range(0,4)) l = list(m) assert sum(l) == 14 assert sum(l) == 14