How To Exclude Specific References From Deepcopy?
Solution 1:
Your class can implement a __deepcopy__
method to control how it is copied. From the copy
module documentation:
In order for a class to define its own copy implementation, it can define special methods
__copy__()
and__deepcopy__()
. The former is called to implement the shallow copy operation; no additional arguments are passed. The latter is called to implement the deep copy operation; it is passed one argument, the memo dictionary. If the__deepcopy__()
implementation needs to make a deep copy of a component, it should call thedeepcopy()
function with the component as first argument and the memo dictionary as second argument.
Simply return a new instance of your class, with the reference you don't want to be deep-copied just taken across as-is. Use the deepcopy()
function to copy other objects:
from copy import deepcopy
classFoo:
def__init__(self, content, linked_to):
self.content = content
self.linked_to = linked_to
def__deepcopy__(self, memo):
# create a copy with self.linked_to *not copied*, just referenced.return Foo(deepcopy(self.content, memo), self.linked_to)
Demo:
>>>a1 = Foo([[1, 2], [3, 4]], None)>>>a2 = Foo([[5, 6], [7, 8]], a1)>>>a3 = deepcopy(a2)>>>a3.linked_to.content.append([9, 10]) # still linked to a1>>>a1.content
[[1, 2], [3, 4], [9, 10]]
>>>a1 is a3.linked_to
True
>>>a2.content is a3.content # content is no longer shared
False
Post a Comment for "How To Exclude Specific References From Deepcopy?"