[Tutor] Standard way to append to a list? ['+=' is in-place
concatenation]
Danny Yoo
dyoo@hkn.eecs.berkeley.edu
Wed Apr 16 21:21:02 2003
On Wed, 16 Apr 2003, Danny Yoo wrote:
> Wait a minute... I can't seem to prove this by overriding the extend()
> method!
>
> ###
> >>> class mylist(list):
> ... def extend(self, other):
> ... print "I'm extend()!"
> ... list.extend(self, other)
> ...
> >>> l = mylist([1, 2, 3])
> >>> l += [4]
> >>> l
> [1, 2, 3, 4]
> >>> l.extend([4])
> I'm extend()!
> ###
>
> Weird! I'm using Python 2.2.1 here; can anyone confirm if this is
> happening with Python 2.2.2 or 2.3alpha? Does this look like a bug to
> anyone else? ... Checking SourceForge... nope, I don't see anything
> about this.
Hi everyone,
Hmmm... I played around with this a little more. It does work if we
override __iadd__ (in-place adding):
###
>>> class mylist(list):
... def __iadd__(self, other):
... print "I'm __iadd__()"
... return list.__iadd__(self, other)
...
>>> l = mylist([1, 2, 3])
>>> l += [4]
I'm __iadd__()
>>> l
[1, 2, 3, 4]
###
__iadd__ is briefly mentioned in the Python Standard Reference here:
http://python.org/doc/current/ref/sequence-types.html
So the system is not totally broken. What appears to be the issue is that
__iadd__() for lists is hardcoded to use the primitive C function
'listextend_internal()'. I feel, though, that a list subclass should
really check to see if the extend() function has been redefined when it's
doing a '+=' operation, to maintain polymorphic behavior. Dunno how that
will affect performance, though.
In any case, I'll send a bug report to SourceForge later tonight and see
how the implementors feel about this... *grin*