Do Python for loops work by reference?
No, variables in Python are not pointers.
They refer to objects on a heap instead, and assigning to a variable doesn't change the referenced object, but the variable. Variables and objects are like labels tied to balloons; assignment reties the label to a different balloon instead.
See this previous answer of mine to explore that idea of balloons and labels a bit more.
That said, some object types implement specific in-place addition behaviour. If the object is mutable (the balloon itself can change), then an in-place add could be interpreted as a mutation instead of an assignment.
So, for integers, item += 1
is really the same as item = item + 1
because integers are immutable. You have to create a new integer object and tie the item
label to that new object.
Lists on the other hand, are mutable and lst += [other, items]
is implemented as a lst.__iadd__([other, items])
and that changes the lst
balloon itself. An assignment still takes place, but it is a reassigment of the same object, as the .__iadd__()
method simply returns self
instead of a new object. We end up re-tying the label to the same balloon.
The loop simply gives you a reference to the next item in the list on each iteration. It does not let you change the original list itself (that's just another set of balloon labels); instead it gives you a new label to each of the items contained.
Well, it really depends on the items.
Take the following case:
class test():
pass
a = test()
a.value = 1
b = test()
b.value = 2
l = [a,b]
for item in l:
item.value += 1
for item in l:
print item.value
>>>
2
3
and in this case:
l2 = [1,2,3]
for item in l2:
item += 1
for item in l2:
print item
>>>
1
2
3
So as you can see, you need to understand the pointers as Martijn said.