Python深度复制。。有点

Python深度复制。。有点,python,reference,Python,Reference,是否只能深度复制特定类型的对象,例如列表、dict或元组 示例:[[1,],] 我想深度复制第一个列表(当然还有..1),但不是SomeObj或OtherObj。这些应该留作参考 对于我不熟悉的函数,可以这样做吗?或者我必须编写自己的函数吗?…我不知道有哪种python工具只会深度复制基本类型并保留其他元素作为引用 我认为您应该能够为此编写一个小的递归函数(不超过20行)。据我所知,没有实用程序可以做到这一点。内置的copy和deepcopy要求对象提供自己的\uuuuuuuuuuuuuuuuu

是否只能深度复制特定类型的对象,例如列表、dict或元组

示例:
[[1,],]

我想深度复制第一个列表(当然还有..1),但不是
SomeObj
OtherObj
。这些应该留作参考


对于我不熟悉的函数,可以这样做吗?或者我必须编写自己的函数吗?…

我不知道有哪种python工具只会深度复制基本类型并保留其他元素作为引用


我认为您应该能够为此编写一个小的递归函数(不超过20行)。

据我所知,没有实用程序可以做到这一点。内置的
copy
deepcopy
要求对象提供自己的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
方法来覆盖默认行为。这不是一个好主意,因为你并不总是想要同样的副本

不过,编写一个函数来实现这一点并不难。下面是一个适用于列表、元组和dict的示例:

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
非常轻松地完成此操作,方法是在每个需要它的类中重写
\uu deepcopy\uuu
方法。如果您希望根据情况采取不同的复制行为,您只需在运行时设置
\uuu deepcopy\uu
功能,然后将其重置:

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

对于更大的事情,可以通过删除tuple分支中的
[
]
以及dict分支中的
[
]
并将
.items()
更改为
.iteritems()
来提高效率。这些改动在风格上也是肾盂式的。@ChrisMorgan-report-updated。谢谢你的提示,我不知道这些表单。如果你不熟悉它们,看看(a)生成器表达式(这是当你取出
[
]
时得到的,否则这是一个列表理解)和(b)迭代器(
dict.items()
生成一个列表,
dict.iterms()
生成迭代器;有关详细信息,请参阅
dict
文档)。