When using a for loop in Python to iterate over items in a list, will changing item (below) change the corresponding item in items?
for item in items:
item += 1
Will each item in items be incremented or remain the same as before the loop?
[Note: I would be interested in Python 2.7 and 3.x]
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
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.
Method 2
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.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0