Augmented assignment (was Re: Something in the function tutorial confused me.)

Roel Schroeven rschroev_nospam_ml at fastmail.fm
Sat Aug 11 13:21:28 EDT 2007


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



More information about the Python-list mailing list