Python: Asignar “a través” de un iterador

Tengo un iterador sobre una secuencia mutable, por ejemplo

foo = [1,2,3,4,5] for bar in foo: 

¿Hay una manera de escribir a los elementos en foo usando la referencia que está contenida en el iterador? La tarea ingenua:

  bar = 42 

No funciona, por supuesto. ¿Es posible usar la referencia “detrás de la cortina” al elemento de secuencia que está en el iterador?

PS: La solución simple con el uso de un índice.

 for i in range(len(a)): a[i] = 42 

no funcionará para mi caso, ya que no puedo exponer el nombre del contenedor.

Desde mi entendimiento, su caso de uso es algo como esto:

 class Z: def __init__(self): self.a, self.b, self.c = 1,2,3 def it(self): for x in self.a, self.b, self.c: yield x z = Z() for x in z.it(): if x == 1: x = 42 # za should be 42? - doesn't work! 

Esto no es posible en Python, no hay ningún tipo de datos “puntero” o “referencia”. Puede solucionar esto al generar una función de establecimiento en lugar de (o junto con) el valor:

 class Z: def __init__(self): self.a, self.b, self.c = 1,2,3 def it(self): for x in 'abc': yield getattr(self, x), lambda y: setattr(self, x, y) z = Z() for x, setter in z.it(): if x == 1: setter(42) # works! 

Use enumerate() para generar índices para usted en el bucle:

 for i, bar in enumerate(foo): foo[i] = bar + 42 

Podrías usar una lista de comprensión :

 foo[:] = [expression for bar in foo] 

o, si la asignación es demasiado complicada para una expresión, podría usar una función, func :

 foo[:] = [func(bar) for bar in foo] 

Si solo tiene un iterador, entonces no hay manera de reasignar valores al contenedor subyacente, ya que no hay garantía de que haya un contenedor subyacente:

 def generator(): for i in range(10): yield i for bar in generator(): # Nothing you put here can change what's going on in generator