in place functions from operator module

Arnaud Delobelle arnodel at googlemail.com
Mon Aug 30 20:51:52 CEST 2010


Raymond Hettinger <python at rcn.com> writes:

> On Aug 29, 8:33 am, Arnaud Delobelle <arno... at googlemail.com> wrote:
>> ernest <nfdi... at gmail.com> writes:
>> > Hi,
>>
>> > The operator module provides separate functions for
>> > "in place" operations, such as iadd(), isub(), etc.
>> > However, it appears that these functions don't really
>> > do the operation in place:
>>
>> > In [34]: a = 4
>>
>> > In [35]: operator.iadd(a, 3)
>> > Out[35]: 7
>>
>> > In [36]: a
>> > Out[36]: 4
>>
>> > So, what's the point? If you have to make the
>> > assignment yourself... I don't understand.
>>
>> > Cheers,
>> > Ernest
>>
>> That's because
>>
>>    a += b
>>
>> is executed as:
>>
>>    a = a.__iadd__(b)
>>
>> For immutable objects, (such as integers), a.__iadd__(b) returns a + b
>> *and then* this value is assigned to a (or rather 'a' is bound to the
>> value).  So for immutables objects, iadd(a, b) is the same as a + b
>>
>> For mutable objects (such as lists), a.__iadd__(b) mutates the object
>> *and then* returns self so that when the assignement is executed, 'a'
>> will still be bound the the same object.  E.g. if a = [1, 2] then
>>
>>     a += [3]
>>
>> will first append 3 to the list and then reassign the list to 'a' (it is
>> unnecessary in this case but if this step was omitted, the "in place"
>> operators wouldn't work on immutables types).
>
> This is an excellent explanation.
> Perhaps, you can submit a documentation
> patch for the operator module so this
> doesn't get lost.
>
>
> Raymond

I have submitted a documentation patch:

http://bugs.python.org/issue9717

-- 
Arnaud



More information about the Python-list mailing list