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. -- Steven -- https://mail.python.org/mailman/listinfo/python-list