我想知道如何在以下背景下完成深度检查:
from copy import deepcopy
def copyExample:
self.myDict = {}
firstPosition = "First"
firstPositionContent = ["first", "primero"]
secondPosition = "Second"
secondPositionContent = ["second"]
self.myDict[firstPosition] = firstPositionContent
self.myDict[secondPosition] = secondPositionContent
return deepcopy(self.myDict)
def addExample(self):
copy = self.copyExample()
copy["Second"].add("segundo")
它是否返回对字典中列表的引用?或者它是否按预期工作,并使用不同的引用复制新列表中的每个列表?
我知道什么是深层拷贝(所以没有必要解释深层和浅层之间的区别)但是我想知道它是否像我期望的那样工作,因此在我使用时不会更改实例变量{ {1}}。
答案 0 :(得分:15)
documentation很明显你得到的是新副本,而不是引用。 Deepcopy为内置类型创建深层副本,但有各种例外,您可以将自定义复制操作添加到用户定义的对象中,以获得对它们的深层复制支持。如果您不确定,那就是单元测试的用途。
答案 1 :(得分:2)
我知道它没有回答你的问题,但我认为对于看这个问题的人来说值得注意。
如果您要复制的数据本质上很简单,则深度查看可能会过度。本质上简单,我的意思是你的数据可以表示为Json。让我用代码说明:
我使用http://www.json-generator.com/来获取一些示例json数据。
def deepCopyList(inp):
for vl in inp:
if isinstance(vl, list):
yield list(deepCopyList(vl))
elif isinstance(vl, dict):
yield deepCopyDict(vl)
def deepCopyDict(inp):
outp = inp.copy()
for ky, vl in outp.iteritems():
if isinstance(vl, dict):
outp[ky] = deepCopyDict(vl)
elif isinstance(vl, list):
outp[ky] = list(deepCopyList(vl))
return outp
def simpleDeepCopy(inp):
if isinstance(inp, dict):
return deepCopyDict(inp)
elif isinstance(inp, list):
return deepCopyList(inp)
else:
return inp
if __name__ == '__main__':
import simplejson as json
import time
from copy import deepcopy
fl = open('sample.json', 'r')
sample = json.load(fl)
start = time.time()
for _ in xrange(10000):
tmp = simpleDeepCopy(sample)
end = time.time()
print 'simpleDeepCopy: ' + str(end - start)
start = time.time()
for _ in xrange(10000):
tmp = deepcopy(sample)
end = time.time()
print 'copy.deepcopy: ' + str(end - start)
输出:
simpleDeepCopy: 0.0132050514221
copy.deepcopy: 2.66142916679
simpleDeepCopy: 0.0128579139709
copy.deepcopy: 2.60736298561