I'm wondering about some details of how for ... in works in Python.
My understanding is for var in iterable
on each iteration creates a variable, var, bound to the current value of iterable. So, if you do for c in cows; c = cows[whatever]
, but changing c within the loop does not affect the original value. However, it seems to work differently if you're assigning a value to a dictionary key.
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
I see one can use enumerate to make the first example work, too, but that's a different story, I guess.
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]
Why does it affect the original list values in the second example but not the first?
[edit]
Thanks for the answers. I was looking at this from a PHP point of view, where you can use the & symbol in foreach to specify whether you are operating on a reference to or a copy of the iterable. I see now that the real difference is a basic detail of how python works regarding immutable objects.