[Tutor] classes and the deepcopy function
Michael H. Goldwasser
goldwamh at slu.edu
Sat Jan 5 03:42:33 CET 2008
Hi Michael,
This is a very interesting example. You do indeed have two distinct
copies. The interdependence you are observing is because you have
defined CLASS-LEVEL variables (akin to static in Java) rather than
instance-level variables. This is because of their declaration
within the context of the class definition.
You should typically initialize instance variables within an
__init__ method and using names qualified with self.
Here is an updated version of your code. If you still need another
explanation of why your previous code executed the way it did, just
let me know.
With regard,
Michael
-----------------------------------------------------
import copy
class point:
"represents a point in 2d space"
def __init__(self):
self.x = 0
self.y = 0
def printpoints(self):
print "x is %g, y is %g" %(self.x, self.y)
class rectangle:
"represents a rectangle"
def __init__(self):
self.width = 0
self.height = 0
self.corner = point()
def move_rectangle(rect, dx, dy):
rect2 = copy.deepcopy(rect)
rect2.corner.x += dx
rect2.corner.y += dy
return rect2
r1 = rectangle()
r1.width = 20
r1.height = 40
r1.corner.x = 10
r1.corner.y = 10
r2 = move_rectangle(r1,5,2)
print 'Rectangle', r1.width, r1.height
r1.corner.printpoints()
print 'Rectangle 2', r2.width, r2.height
r2.corner.printpoints()
On Saturday January 5, 2008, Michael wrote:
> Hi
>
> I was trying to learn about classes in Python and have been playing
> around but I am having a problem with the deepcopy function. I want to
> have a function that returns a clean copy of an object that you can
> change without it changing the original, but no matter what I do the
> original changes as well. Can anyone give ma a pointer?
>
> Thanks
> Michael
> --------------------------
> import copy
>
> class point:
> "represents a point in 2d space"
> x = 0
> y = 0
> def printpoints(self):
> print "x is %g, y is %g" %(self.x, self.y)
>
> class rectangle:
> "represents a rectangle"
> width = 0
> height = 0
> corner = point()
>
> def move_rectangle(rect, dx, dy):
> rect2 = copy.deepcopy(rect)
> rect2.corner.x += dx
> rect2.corner.y += dy
> return rect2
>
> r1 = rectangle()
> r1.width = 20
> r1.height = 40
> r1.corner.x = 10
> r1.corner.y = 10
> r2 = move_rectangle(r1,5,2)
> print 'Rectangle', r1.width, r1.height
> r1.corner.printpoints()
> print 'Rectangle 2', r2.width, r2.height
> r2.corner.printpoints()
More information about the Tutor
mailing list