Semi-newbie, rolling my own __deepcopy__

ladasky at my-deja.com ladasky at my-deja.com
Mon Apr 4 11:37:46 EDT 2005


Hi, folks,

First, the obligatory cheerleading -- then, my questions...

I love Python!  I am only an occasional programmer.  Still, the logic
of the language is clear enough that I can retain pretty much all that
I have learned from one infrequent programming session to the next.
That's quite an accomplishment for a language this powerful.  Also, I'm
finally beginning to grasp OOP.  I could never quite get the hang of it
in C++ or Java.  Recently, I discovered __getitem__ and pickle.  Oh,
yeah.

Anyway, my present problem is that I want to make copies of instances
of my own custom classes.  I'm having a little trouble understanding
the process.  Not that I think that it matters -- but in case it does,
I'll tell you that I'm running Python 2.3.4 on a Win32 machine.

I started naively, thinking that I could just call copy.deepcopy() and
be done with it.  After getting a TypeError from the interpreter, I
read the deepcopy docs and discovered that I need to implement a
__deepcopy__ method in my class.  But the docs are a bit vague here.
What exactly should this __deepcopy__ do?  I tried looking for examples
of __deepcopy__ code on the Net, but I'm not quite understanding what
I'm finding there.  I guess that I'm getting deeper into the guts of
Python than I planned.

AFAIK, I'm supposed to add a "def __deepcopy__(self, memo):" to my
class definition.  This will get called when I invoke
copy.deepcopy(myObject).  The object to be copied is self, I presume.
What exactly is memo?  The docs say that it's a dictionary which "keeps
track of what has already been copied."  Somewhere I remember reading
that the namespace of an object is a dictionary.  So is memo identical
to the dictionary of the new object that I'm trying to create?  What
exactly do I add to memo?  I think that I should make shallow copies of
methods, but deep copies of data structures (the contents of which I'm
likely to change).  Do I iterate through and copy the items in
dir(self)?  Do I update memo manually, or does passing memo into copy()
or deepcopy() automatically update memo's contents?  Are there any
items that I *shouldn't* copy from self to memo?  Should __deepcopy__
return memo?

Sorry for all the confusion -- and thanks for your help!

--
Rainforest laid low.
"Wake up and smell the ozone,"
Says man with chainsaw.
John J. Ladasky Jr., Ph.D.




More information about the Python-list mailing list