Tuples and immutability

Steven D'Aprano steve at pearwood.info
Wed Mar 12 07:28:01 CET 2014

On Tue, 11 Mar 2014 23:25:19 -0400, Terry Reedy wrote:

> On 3/11/2014 10:01 PM, Rick Johnson wrote:
>> On Thursday, February 27, 2014 4:18:01 PM UTC-6, Ian wrote:
>>> x += y is meant to be equivalent, except possibly in-place and more
>>> efficient, than x = x + y.
> The manual actually says "An augmented assignment expression like x += 1
> can be rewritten as x = x + 1 to achieve a similar, but not exactly
> equal effect. In the augmented version, x is only evaluated once. Also,
> when possible, the actual operation is performed in-place, meaning that
> rather than creating a new object and assigning that to the target, the
> old object is modified instead.
>> In an ideal world, the speed of these two codes should be the same,
> Nope, 'similar' is not 'equivalent'. Evaluating x twice instead of once
> and possibly allocating a new object versus not take extra time. In a
> statement like "x.y.z[3*n+m] += 1", calculating the target dominates the
> time to increment, so this form should be nearly twice as fast.

Excellent point Terry!

I always forget that the target of an augmented assignment may not be a 
simple name like "x" but can be an arbitrary complex reference, anything 
that is a legal assignment target. Because += is documented as only 
evaluating the expression once it can behave quite differently to the 
`spam = spam + 1` case. Evaluating the right hand side may have side-
effects that change what the left hand side evaluates to. This is not the 
case with the augmented assignment.


More information about the Python-list mailing list