只能深度复制某些类型的对象,例如列表,字典或元组,是否可行
示例:[[1, <SomeObj>], <OtherObj>]
我想深层复制第一个列表(当然还有1个),但不是SomeObj
或OtherObj
。那些应该作为参考。
有可能用一些我不熟悉的功能或者我必须编写自己的功能吗?...
答案 0 :(得分:4)
您可以通过覆盖所需的每个类中的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
答案 1 :(得分:3)
据我所知,这样做没有用处。内置插件copy
和deepcopy
要求对象提供自己的__copy__
和__deepcopy__
方法来覆盖默认行为。这不是一个好主意恕我直言,因为你总是想要同样的副本......
编写一个函数来做到这一点应该不难。这是一个适用于列表,元组和词组的示例:
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
答案 2 :(得分:1)
我不知道任何python工具只会深度复制基本类型并将其他元素保留为引用。
我认为你应该能够编写一个小的递归函数(20行以下)。