21

次のコンテキストでディープコピーがどのように機能するのか疑問に思っていました:

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()

4

2 に答える 2

15

ドキュメントは、参照ではなく、新しいコピーを取得していることを明確に示しています。Deepcopyは、さまざまな例外を除いて、組み込み型のディープコピーを作成します。また、カスタムコピー操作をユーザー定義オブジェクトに追加して、それらのディープコピーサポートを取得することもできます。よくわからない場合は、それが単体テストの目的です。

于 2009-05-08T07:49:17.400 に答える
2

あなたの質問に答えていないことはわかっていますが、この質問を見ている人にとっては注目に値すると思います。

コピーするデータが本質的に単純な場合、deepcopy はやり過ぎかもしれません。シンプルな性質とは、データが 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
于 2014-02-20T09:51:02.043 に答える