Python深度复制..那种

时间:2012-01-14 02:53:31

标签: python reference

只能深度复制某些类型的对象,例如列表,字典或元组,是否可行

示例:[[1, <SomeObj>], <OtherObj>]

我想深层复制第一个列表(当然还有1个),但不是SomeObjOtherObj。那些应该作为参考。

有可能用一些我不熟悉的功能或者我必须编写自己的功能吗?...

3 个答案:

答案 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)

据我所知,这样做没有用处。内置插件copydeepcopy要求对象提供自己的__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行以下)。

相关问题