How to deepcopy a list of user defined lists?
Terry Reedy
tjreedy at udel.edu
Thu Jan 8 15:33:59 EST 2009
srinivasan srinivas wrote:
> Hi,
> I have a class which is a subclass of builtin-type list.
>
> #------------------------------------------------------------------------------
> class clist(list):
> def __new__(cls, values, ctor):
> val = []
> for item in values:
> item = ctor(item)
> val.append(item)
>
> self = list.__new__(cls, val)
> self.__values = val
> self.__ctor = ctor
> return self
A subclass of list should populate the list in __init__, not __new__,
usually by calling list.__init__, as lists are mutable and subclasses
thereof should be too.
class clist(list):
def __init__(self, values, ctor):
list.__init__(self, map(ctor, values))
self.__ctor = ctor
clist1 = clist((1,2,3),str)
clist2 = clist((1,2,3), float)
alist1 = [clist1,clist2]
print(alist1)
#[['1', '2', '3'], [1.0, 2.0, 3.0]]
from copy import deepcopy
alist2 = deepcopy(alist1)
print(alist2)
#[['1', '2', '3'], [1.0, 2.0, 3.0]]
print(alist1[0] is alist2[0])
#False - ie, inner clist was copied
I omitted your __values attribute as redundant with the value of the
clist itself. Since clist is not a mixin class, double underscores for
name-mangling are not needed.
Unless you make use of _ctor in other methods, initializing regular
lists with 'list(map(ctor,values)) would work as well.
Terry Jan Reedy
More information about the Python-list
mailing list