OKB (not okblacke) schreef: > Aahz wrote: > >>>>>>> tup=([],) >>>>>>> tup[0] += ['zap'] >>>> Traceback (most recent call last): >>>> File "<stdin>", line 1, in <module> >>>> TypeError: 'tuple' object does not support item assignment > <snip> >> Obviously, you can easily work around it: >> >>>>> t = ([],) >>>>> l = t[0] >>>>> l += ['foo'] >>>>> t >> (['foo'],) > > This is quite shocking to me, although after staring at the > documentation for a while I guess I understand it. But it seems to me > that the documentation is somewhat misleading on this point, where it > says: > > "An augmented assignment evaluates the target (which, unlike normal > assignment statements, cannot be an unpacking) and the expression list, > performs the binary operation specific to the type of assignment on the > two operands, and assigns the result to the original target." > > This sentence is phrased as though it is the whole story, but it > isn't, because the operation might not in fact wind up being an > assignment.
The way I understand this now, the assignment really always is an assignment. 1. - For immutable objects, the 'binary operation specific to the type of assignment on the two operands' doesn't modify any object, but only returns a new object which is the result of the operation. - For mutable objects that support the inplace-version of the operator, the operator modifies the object and then returns it. 3. In both cases that result is assigned to the target. In the second case the object was already modified so the assignment doesn't accomplish very much, but it still happens. That explains why "tup[0] += ['zap']" both has an effect (tup[0] now contains 'zap') and raises an exception: tup[0] is modified because it is a list and lists support inplace addition, but the assignment fails because tuples don't support item assignment. -- If I have been able to see further, it was only because I stood on the shoulders of giants. -- Isaac Newton Roel Schroeven -- http://mail.python.org/mailman/listinfo/python-list