example - deepcopy python 3
Diccionario pitón deepcopy (2)
Me preguntaba cómo funciona exactamente la copia en profundidad en el siguiente contexto:
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")
¿Devuelve la referencia a las listas que tengo en el diccionario? ¿O funciona como espero y copia cada lista en una nueva lista con una referencia diferente?
Sé lo que es una copia profunda (por lo que no es necesario explicar la diferencia entre profundidad y poca profundidad), pero me pregunto si funciona como espero que haga y, por lo tanto, no cambio la variable de instancia cuando uso addExample()
.
La documentation deja bastante claro que está obteniendo nuevas copias, no referencias. Deepcopy crea copias en profundidad para los tipos incorporados, con varias excepciones, y puede agregar operaciones de copia personalizadas a sus objetos definidos por el usuario para obtener también soporte de copia en profundidad para ellos. Si no estás seguro, bueno, para eso están las pruebas unitarias.
Sé que no está respondiendo a tu pregunta, pero creo que es notable para las personas que miran esta pregunta.
Si los datos que está copiando son simples en su naturaleza, la copia en profundidad puede ser una exageración. Con simple naturaleza me refiero a si sus datos se pueden representar como Json. Déjame ilustrar con el código:
He usado http://www.json-generator.com/ para obtener algunos datos de muestra de 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)
salida:
simpleDeepCopy: 0.0132050514221
copy.deepcopy: 2.66142916679
simpleDeepCopy: 0.0128579139709
copy.deepcopy: 2.60736298561