On Thu, Jun 25, 2015 at 9:52 AM, fl <rxjw...@gmail.com> wrote: > The reason is that list implements __iadd__ like this (except in C, not > Python): > > class List: > def __iadd__(self, other): > self.extend(other) > return self > When you execute "nums += more", you're getting the same effect as: > > nums = nums.__iadd__(more) > which, because of the implementation of __iadd__, acts like this: > > nums.extend(more) > nums = nums > So there is a rebinding operation here, but first, there's a mutating > operation, and the rebinding operation is a no-op.
It's not a complete no-op, as can be demonstrated if you use something other than a simple name: >>> tup = ("spam", [1, 2, 3], "ham") >>> tup[1] [1, 2, 3] >>> tup[1].extend([4,5]) >>> tup[1] = tup[1] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment >>> tup ('spam', [1, 2, 3, 4, 5], 'ham') >>> tup[1] += [6,7] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'tuple' object does not support item assignment >>> tup ('spam', [1, 2, 3, 4, 5, 6, 7], 'ham') The reason for the rebinding is that += can do two completely different things: with mutable objects, like lists, it changes them in place, but with immutables, it returns a new one: >>> msg = "Hello" >>> msg += ", world!" >>> msg 'Hello, world!' This didn't change the string "Hello", because you can't do that. Instead, it rebound msg to "Hello, world!". For consistency, the += operator will *always* rebind, but in situations where that's not necessary, it rebinds to the exact same object. Does that answer the question? ChrisA -- https://mail.python.org/mailman/listinfo/python-list