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?

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