Вы можете сделать это с помощью copy.deepcopy
довольно легко, переопределив метод __deepcopy__
в каждом из классов, в которых он вам нужен. Если вам нужно различное поведение копирования в зависимости от ситуации, вы можете просто установить функцию __deepcopy__
во время выполнения, а затем сбросьте его:
import copy
class OtherObject(object):
pass
l = [[1, 2, 3], [4, 5, 6], OtherObject()]
# first, save the old deepcopy if there is one
old_deepcopy = None
if hasattr(OtherObject, __deepcopy__):
old_deepcopy = OtherObject.__deepcopy__
# do a shallow copy instead of deepcopy
OtherObject.__deepcopy__ = lambda self, memo: self
l2 = copy.deepcopy(l)
# and now you can replace the original behavior
if old_deepcopy is not None:
OtherObject.__deepcopy__ = old_deepcopy
else:
del OtherObject.__deepcopy__
>>> l[0] is l2[0]
False
>>> l[1] is l2[1]
False
>>> l[2] is l2[2]
True