Michael Spencer wrote:
http://www.python.org/doc/2.3.3/lib/module-copy.html
deepcopy:
...
This version does not copy types like module, class, function, method, stack trace, stack frame, file, socket, window, *array*, or any similar types.
...


On reflection, I realize that this says that the array type is not deep-copyable, not array instances. Still, it does appear that array instances don't play nicely with deepcopy

It appears that if you want to deepcopy an object that may contain arrays, you're going to have to 'roll your own' deep copier. Something like this would do it:

class Test1(object):

    def __init__(self, **items):
        self.items = items

    def __deepcopy__(self, memo={}):
        mycls = self.__class__
        newTestObj = mycls.__new__(mycls)
        memo[id(self)] = newTestObj

        # We need a deep copy of a dictionary, that may contain
        # items that cannot be deep copied.  The following code
        # emulates copy._deepcopy_dict, so it should act the same
        # way as deepcopy does.

        x = self.items
        y = {}
        memo[id(x)] = y
        for key, value in x.iteritems():
            try:
                newkey = deepcopy(key, memo)
            except TypeError:
                newkey = copy(key)
            try:
                newvalue = deepcopy(value, memo)
            except TypeError:
                newvalue = copy(value)
            y[newkey] = newvalue

        newTestObj.__init__(**y)
        return newTestObj

    def __repr__(self):
        return '%s object at %s: %s' % (self.__class__.__name__
                                    , hex(id(self)), self.items)

 >>> t = Test1(a=array("d",[1,2,3]))
 >>> t
 Test1 object at 0x196c7f0: {'a': array('d', [1.0, 2.0, 3.0])}
 >>> t1 = deepcopy(t)
 >>> t1
 Test1 object at 0x1b36b50: {'a': array('d', [1.0, 2.0, 3.0])}
 >>>

BTW: are you sure you really need to copy those arrays?

Michael

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to