Me pregunto sobre algunos detalles de cómo ... en trabajos en Python.¿Por qué el "para ... en" funciona de manera diferente en una lista de valores frente a una lista de diccionarios?
Mi comprensión es for var in iterable
en cada iteración crea una variable, var, vinculada al valor actual de iterable. Entonces, si haces for c in cows; c = cows[whatever]
, pero cambiar c dentro del ciclo no afecta el valor original. Sin embargo, parece funcionar de manera diferente si está asignando un valor a una clave de diccionario.
cows=[0,1,2,3,4,5]
for c in cows:
c+=2
#cows is now the same - [0,1,2,3,4,5]
cows=[{'cow':0},{'cow':1},{'cow':2},{'cow':3},{'cow':4},{'cow':5}]
for c in cows:
c['cow']+=2
# cows is now [{'cow': 2}, {'cow': 3}, {'cow': 4}, {'cow': 5}, {'cow': 6}, {'cow': 7}
#so, it's changed the original, unlike the previous example
veo uno puede utilizar enumeración de hacer el primer trabajo ejemplo, también, pero eso es una historia diferente, supongo.
cows=[0,1,2,3,4,5]
for i,c in enumerate(cows):
cows[i]+=1
# cows is now [1, 2, 3, 4, 5, 6]
¿Por qué afecta los valores de la lista original en el segundo ejemplo, pero no el primero?
[editar]
Gracias por las respuestas. Estaba viendo esto desde un punto de vista PHP, donde puede usar el símbolo & en foreach para especificar si está operando en una referencia o una copia del iterable. Ahora veo que la diferencia real es un detalle básico de cómo funciona Python con respecto a los objetos inmutables.
Acepté su respuesta porque 'inmutable' es la palabra mágica. Recuerdo ahora que los enteros son objetos separados en Python, por lo que se volvió a vincular ese nombre a otro objeto en el primer ejemplo y se modificó el mismo objeto en el segundo. – JAL