On 3/27/06, Travis Oliphant
If you have Numeric or numpy installed try this:
#import Numeric as N import numpy as N
a = range(10) b = N.arange(10)
a.__iadd__(b)
print a
Result:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Contrast the returned output with
import numpy as N
a = range(10) b = N.arange(10)
a += b
print a
Result:
[ 0 2 4 6 8 10 12 14 16 18]
Having "a+=b" and "a.__iadd__(b)" do different things seems like an unfortunate bug.
It seems to me that the problem is that the INPLACE_ADD and INPLACE_MULTIPLY cases in ceval.c use PyNumber_InPlace<YYY> instead of trying PySequence_InPlace<YYY> when the object doesn't support the in-place number protocol.
I could submit a patch if there is agreement that this is a problem.
Well how is the interpreter to know whether += meanse numeric add or sequence add in any particular case? Shouldn't it be numpy's responsibility to implement both operations identically? (It's a design bug in Python that the + operation has two implementation slots. But it's difficult to fix that until Python 3000. It *will* be fixed there.) -- --Guido van Rossum (home page: http://www.python.org/~guido/)