copia profunda de python y copia superficial y referencia de pase

Una pregunta sobre la copia profunda de python y copia superficial.

la publicación en ¿Cuál es la diferencia entre una copia profunda y una copia superficial?

no puede ayudarme

¿Por qué, por ejemplo, la sum de 1 es 6 no 10?

eg1:

kvps = { '1' : 1, '2' : 2 } theCopy = kvps.copy() # both point to the same mem location ? kvps['1'] = 5 sum = kvps['1'] + theCopy['1'] print sum 

la sum de salida es 6

    eg2:

     aList = [1,2] bList = [3,4] kvps = { '1' : aList, '2' : bList } theCopy = kvps.copy() # both point to the same mem location ? kvps['1'][0] = 5 sum = kvps['1'][0] + theCopy['1'][0] print sum 

    la sum de salida es 10

    eg3:

     import copy aList = [1,2] bList = [3,4] kvps = { '1' : aList, '2' : bList } theCopy = copy.deepcopy(kvps) kvps['1'][0] = 5 sum = kvps['1'][0] + theCopy['1'][0] print sum 

    La sum de salida es 6.

    También, por ejemplo, 4

     kvps = { '1' : 1, '2' : 2 } theCopy = dict(kvps) # theCopy hold a reference to kvps ? kvps['1'] = 5 # should also change theCopy , right ? sum = kvps['1'] + theCopy['1'] print kvps print theCopy print sum 

    su sum es 6, si theCopy es una referencia a kvps, debería ser 10.

    Copia superficial hace una copia de objetos mutables en el contenedor de nivel superior. Una copia profunda crea una nueva instancia de todos los contenedores mutables en la estructura de datos.

    “por ejemplo, 2” da como resultado 10 porque usted copia el dict en el exterior, pero las dos listas internas siguen siendo las antiguas, y las listas se pueden cambiar in situ (son mutables).

    Deep copy realiza las ejecuciones aList.copy (), bList.copy () y reemplaza los valores en su dictado con sus copias.


    por ejemplo 1 explicado:

     kvps = {'1': 1, '2': 2} theCopy = kvps.copy() # the above is equivalent to: kvps = {'1': 1, '2': 2} theCopy = {'1': 1, '2': 2} 

    Cuando se aplica esto a, por ejemplo, 2:

     kvps = {'1': aList, '2': bList} theCopy = {'1': aList, '2': bList} 

    Los objetos de la lista en ambos dictados son los mismos objetos, por lo que la modificación de una de las listas se reflejará en ambos dictados.


    Hacer una copia profunda (por ejemplo, 3) resulta en esto:

     kvps = {'1': aList, '2': bList} theCopy = {'1': [1, 2], '2': [3, 4]} 

    Esto significa que ambos dictados tienen contenidos completamente diferentes, y modificar uno no modificará el otro.


    por ejemplo, 4 a través de dict() es equivalente a una copia superficial.

    eg1
    En este ejemplo, usted hace copias de las claves pero no de los objetos a los que apuntan. Cambiar lo que apunta una clave no cambia la copia de esa clave. Esto se debe a que la copia de la clave existe en un lugar diferente en la memoria y solo apuntará al mismo objeto hasta que se reasigne. La reasignación de una de las copias no cambia la otra, por lo que obtiene 6.

    eg2
    Las llaves se copian. Ambas teclas apuntan a los mismos objetos. La asignación modifica el objeto al que apuntan ambas claves (aunque ambas claves están en diferentes lugares en la memoria), por lo que el cambio se ve en ambas en la sum.

    eg3
    Todo se copia. Cada tecla apunta a su propia copia de los objetos. Ahora hay dos “aList” s en la memoria. La aList apuntada por KVPS se cambia mientras que la “aList” apuntada por COPY no lo es.

    http://docs.python.org/library/copy.html