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