Tuples and immutability

Ian Kelly ian.g.kelly at gmail.com
Wed Mar 12 05:40:29 EDT 2014


On Wed, Mar 12, 2014 at 12:28 AM, Steven D'Aprano <steve at pearwood.info> wrote:
> On Tue, 11 Mar 2014 23:25:19 -0400, Terry Reedy wrote:
>> 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.

Of course one could also do:

    z = x.y.z
    i = 3*n+m
    z[i] = z[i] + 1

which reduces the duplicated work down to storing and loading a couple
of locals, and also prevents side-effects from affecting the LHS
evaluation.



More information about the Python-list mailing list