The +=
operator in python seems to be operating unexpectedly on lists. Can anyone tell me what is going on here?
class foo:
bar = []
For the general case, see Scott Griffith's answer. When dealing with lists like you are, though, the +=
operator is a shorthand for someListObject.extend(iterableObject)
. See the documentation of extend().
The extend
function will append all elements of the parameter to the list.
When doing foo += something
you're modifying the list foo
in place, thus you don't change the reference that the name foo
points to, but you're changing the list object directly. With foo = foo + something
, you're actually creating a new list.
This example code will explain it:
>>> l = []
>>> id(l)
13043192
>>> l += [3]
>>> id(l)
13043192
>>> l = l + [3]
>>> id(l)
13059216
Note how the reference changes when you reassign the new list to l
.
As bar
is a class variable instead of an instance variable, modifying in place will affect all instances of that class. But when redefining self.bar
, the instance will have a separate instance variable self.bar
without affecting the other class instances.