Python字典深拷贝
Python字典深拷贝
我在想在以下情况下深度复制是如何工作的:
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")
它会返回我在字典中拥有的列表的引用吗?还是像我期望的那样,将每个列表复制到一个不同引用的新列表中?
我知道什么是深度复制(所以没有必要解释深度复制和浅复制之间的区别),但我在想它是否像我期望的那样工作,因此在使用addExample()
时不改变实例变量。
admin 更改状态以发布 2023年5月20日
我知道这并不是回答你问题的方式,但是我认为对于查看这个问题的人来说,这是值得注意的。
如果你要复制的数据本质上很简单,那么深度复制可能过于复杂。我所说的简单是指你的数据可以表示为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) else: yield 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