var or inout parm?

Marc 'BlackJack' Rintsch bj_666 at gmx.net
Fri Dec 12 09:08:28 EST 2008


On Fri, 12 Dec 2008 05:39:35 -0800, sturlamolden wrote:

> On Dec 12, 2:34 pm, Hrvoje Niksic <hnik... at xemacs.org> wrote:
> 
>> >>> import numpy
>> >>> t = (numpy.zeros(10),)
>> >>> t
>>
>> (array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]),)>>> t[0] +=
>> 1
>>
>> Traceback (most recent call last):
>>   File "<stdin>", line 1, in <module>
>> TypeError: 'tuple' object does not support item assignment
>>
>> Of course, the side effect occurs before the exception, so:
>>
>> >>> t[0]
> 
>> array([ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.])
> 
> 
> Actually I would consider this to be a bug. The tuple is immutable, but
> no mutation of the tuple is ever attempted.

No bug because a mutation *is* attempted.  ``a += x`` calls `a.__iadd__` 
which *always* returns the result which is *always* rebound to the name 
`a`.  Even with mutable objects where `__iadd__()` simply returns 
`self`!  It has to be this way because the compiler has no idea if the 
object bound to `a` will be mutable or immutable when the code actually 
runs.

In [252]: def f(a, x):
   .....:     a += x
   .....:

In [253]: dis.dis(f)
  2           0 LOAD_FAST                0 (a)
              3 LOAD_FAST                1 (x)
              6 INPLACE_ADD
              7 STORE_FAST               0 (a)
             10 LOAD_CONST               0 (None)
             13 RETURN_VALUE

Ciao,
	Marc 'BlackJack' Rintsch



More information about the Python-list mailing list