I have this initialiser for a line class in Python and it takes two points as a parameter. The problem is my initialiser is only copying the references. So self.point0 and point 0 are pointing to the same object. I am not really sure how to change that so that I am not just copying the reference. Line class:
def __init__(self, point0, point1):
self.point0 = point0
self.point1 = point1
Point class:
def __init__(self, x, y):
self.x = x
self.y = y
1 Answer 1
Use the copy module:
import copy
def __init__(self, point0, point1):
self.point0 = copy.copy(point0)
self.point1 = copy.copy(point1)
This is required if your point objects are mutable, such as a lists or dictionaries. If you are using immutable types, such as a tuple, then it would not be required to make a copy.
If your points are represented as lists, you can also make a copy of the list using this syntax:
self.point0 = point0[:]
self.point1 = point1[:]
I could advise you with more certainty if you provided the definition of your point class.
Update after OP has posted Point class definition:
If copy.copy() is undesirable (why?) you can manually copy the attributes to the new Point instances:
class Line(object):
def __init__(self, point0, point1):
self.point0 = Point(point0.x, point0.y)
self.point1 = Point(point1.x, point1.y)
3 Comments
Point class in you question.collections.namedtuple for your Points... depends on what else your class is doing..Point class then you need to use copy.copy(), or create Point instances in Line.__init__() as shown in the update to my answer.
copy.copynot satisfactory?LineandPointcould easily be redefined asnamedtuples. They'd be immutable, and perhaps would enforce the exclusivity you would prefer.copy.copywould still work, as would creating new instances.