Aahz schreef: >>>> def foo(bar): bar[0] += ['zap'] > ... >>>> import dis >>>> dis.dis(foo) > 1 0 LOAD_FAST 0 (bar) > 3 LOAD_CONST 1 (0) > 6 DUP_TOPX 2 > 9 BINARY_SUBSCR > 10 LOAD_CONST 2 ('zap') > 13 BUILD_LIST 1 > 16 INPLACE_ADD > 17 ROT_THREE > 18 STORE_SUBSCR > 19 LOAD_CONST 0 (None) > 22 RETURN_VALUE > > Notice the critical sequence: BINARY_SUBSCR, INPLACE_ADD, STORE_SUBSCR. > It has to work that way to allow this: > >>>> l = [7] >>>> l[0] += 1 >>>> l > [8] > > There's simply no way to get augmented assignment to work correctly with > both lists and tuples when you allow both mutable and immutable elements. > Someone will always get surprised, and overall with strings and numbers > being the canonical list elements, I think making augmented assignment > work correctly with lists and immutables was the best decision.
Thank you, I get it now. With that disassembled code in mind I had another look at the relevant section in the Language Reference; now I have a much better understanding of what's really happening. I used to interpret the target in 'The target is only evaluated once' more like an L-value in C/C++. That's not correct, of course, but I didn't understand exactly how wrong it was until now. -- 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