[Tutor] classes and the deepcopy function
Michael H. Goldwasser
goldwamh at slu.edu
Sat Jan 5 03:42:33 CET 2008
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.
"represents a point in 2d space"
self.x = 0
self.y = 0
print "x is %g, y is %g" %(self.x, self.y)
"represents a rectangle"
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
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
print 'Rectangle 2', r2.width, r2.height
On Saturday January 5, 2008, Michael wrote:
> 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?
> 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
> print 'Rectangle 2', r2.width, r2.height
More information about the Tutor