【发布时间】:2017-11-01 04:42:08
【问题描述】:
仅用于教育目的,我正在尝试实现copy.deepcopy() 的克隆功能。
在玩了一些代码和谷歌搜索之后,我想出了以下函数:
def my_deepcopy(data):
if isinstance(data, dict):
result = {}
for key, value in data.items():
result[key] = my_deepcopy(value)
assert id(result) != id(data)
elif isinstance(data, list):
result = []
for item in data:
result.append(my_deepcopy(item))
assert id(result) != id(data)
elif isinstance(data, tuple):
aux = []
for item in data:
aux.append(my_deepcopy(item))
result = tuple(aux)
assert id(result) != id(data)
elif isinstance(data, (int, float, type(None), str, bool)):
result = data
else:
raise ValueError("unexpected type")
return result
似乎适用于所有 Python 原始类型及其组合:
# Various object types
lst_obj = [ 0, 1.1, 'foo', 'bar' ]
dict_obj = { 'zero' : 0, 'pi' : 3.1415, 'desc' : 'foobar' }
list_list_obj = [ [1,2,3], [4,5,6], [7,8,9] ]
tuple_list_obj = [ (-1,-1), (0,-1,0), (-1,0), (0,0,0,0) ]
dict_list_obj = [ {'zero' : 0}, {'pi' : 3.1415}, {'desc' : 'foobar'} ]
# Testing
my_deepcopy( lst_obj ) #OK!
my_deepcopy( dict_obj ) #OK!
my_deepcopy( list_list_obj ) #OK!
my_deepcopy( tuple_list_obj ) #OK!
my_deepcopy( dict_list_obj ) #OK!
到目前为止,一切都很好,但是 Arbitrary Types 呢?如何复制任意对象的实例?我如何检测它?任意类型是否有任何类型的复制构造函数?
我的函数中缺少什么以使以下代码正常工作:
class Xpto:
pass
arbitrary = [ Xpto(), Xpto() ]
my_deepcopy( arbitrary ) #ValueError("unexpected type")
【问题讨论】:
-
这其实是现在python开发者们讨论的话题。似乎没有一个简单的解决方案,至少对于大多数对象的
copy()方法而言。订阅 python-dev listserve 了解更多详情。