Python字典深拷贝

16 浏览
0 Comments

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日
0
0 Comments

我知道这并不是回答你问题的方式,但是我认为对于查看这个问题的人来说,这是值得注意的。

如果你要复制的数据本质上很简单,那么深度复制可能过于复杂。我所说的简单是指你的数据可以表示为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

0
0 Comments

文档很清楚地表示你得到的是新的副本,而不是引用。Deepcopy为内置类型创建深度副本,有各种例外情况,你可以添加自定义复制操作到你的用户定义对象中,以便为它们获得深度复制支持。如果你不确定,那就是单元测试的用处。

0