次のコンテキストで、正確にディープコピーがどのように機能するのか疑問に思いました。
_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()
。
documentation は、参照ではなく、新しいコピーを取得していることを明確に示しています。 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