> In point #3, you really bind a name to a value. As you probably know, in > Python, there are names and objects. The initial value of the name 'a' > is 1. It is an immutable object. The "+=" operator usually increments a > value of an object. However, because the 'int' type is immutable, the += > operator will rather rebind this variable to a newly created value. I > believe this is what is happening here.
Your believes aside, this is simply wrong. The statement a += x always leads to a rebinding of a to the result of the operation +. I presume you got confused by the somewhat arbitrary difference between __add__ and __iadd__ that somehow suggest there is an in-place-modification going on in case of mutables. but as the following snippet shows - that's not the case: class Foo(object): def __add__(self, o): return "__add__" def __iadd__(self, o): return "__iadd__" a = Foo() a += 1 print a a = Foo() b = Foo() c = a + b print c So you see, the first += overrides a with the returned value of __iadd__. The reason for the difference though is most probably what you yourself expected: thus it's possible to alter a mutable in place. Diez -- http://mail.python.org/mailman/listinfo/python-list