Python deepcopy .. вид

Возможно ли только глубокое копирование определенных типов объектов, таких как список, диктовка или кортеж

Пример: [[1, <SomeObj>], <OtherObj>]

Я хочу скопировать первый список (и, конечно же, 1), но не SomeObj или OtherObj . Те должны оставаться в качестве рефери.

Возможно ли это сделать с помощью некоторой функции, с которой я не знаком или мне нужно написать свою собственную функцию? …

Насколько я знаю, нет никакой полезности для этого. Встроенная copy и deepcopy copy требуют, чтобы объекты предоставляли свои методы __copy__ и __deepcopy__ чтобы переопределить поведение по умолчанию. Это не очень хорошая идея ИМХО, поскольку вам не всегда нужны копии того же типа …

Написание функции для этого не должно быть сложным. Вот пример, который работает для списков, кортежей и dicts:

 def mycopy(obj): if isinstance(obj, list): return [mycopy(i) for i in obj] if isinstance(obj, tuple): return tuple(mycopy(i) for i in obj) if isinstance(obj, dict): return dict(mycopy(i) for i in obj.iteritems()) return obj 

Вы можете сделать это с помощью 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 

Я не знаю ни одного инструмента python, который будет глубоко скопировать только базовые типы и сохранить другие элементы в качестве ссылок.

Я думаю, что вы должны написать небольшую рекурсивную функцию для этого (до 20 строк).