Mientras lee la documentación dict.copy()
, dice que hace una copia superficial del diccionario. Lo mismo ocurre con el libro que estoy siguiendo (Beazley's Python Reference), que dice:
El método m.copy () hace una copia superficial de los elementos contenidos en un objeto de mapeo y los coloca en un nuevo objeto de mapeo.
Considera esto:
>>> original = dict(a=1, b=2)
>>> new = original.copy()
>>> new.update({'c': 3})
>>> original
{'a': 1, 'b': 2}
>>> new
{'a': 1, 'c': 3, 'b': 2}
Así que supuse que esto actualizaría el valor de original
(y agregaría 'c': 3) también porque estaba haciendo una copia superficial. Como si lo hicieras por una lista:
>>> original = [1, 2, 3]
>>> new = original
>>> new.append(4)
>>> new, original
([1, 2, 3, 4], [1, 2, 3, 4])
Esto funciona como se esperaba.
Dado que ambas son copias poco profundas, ¿por qué dict.copy()
no funciona como esperaba? ¿O mi comprensión de la copia superficial o profunda es defectuosa?
python
dictionary
copy
usuario225312
fuente
fuente
Respuestas:
Por "copia superficial" significa que el contenido del diccionario no se copia por valor, sino que simplemente crea una nueva referencia.
Por el contrario, una copia profunda copiará todos los contenidos por valor.
Entonces:
b = a
: Asignación de referencia, Makea
yb
puntos al mismo objeto.b = a.copy()
: Copia superficial,a
yb
se convertirán en dos objetos aislados, pero sus contenidos aún comparten la misma referenciab = copy.deepcopy(a)
: Copia profunda,a
yb
la estructura y el contenido quedan completamente aislados.fuente
L
volver a usarlob
. Hacerlo simplificaría el ejemplo.b[1][0] = 5
. Sib
es una copia superficial, acaba de cambiara[1][0]
.No es una cuestión de copia profunda o copia superficial, nada de lo que está haciendo es copia profunda.
Aquí:
está creando una nueva referencia a la lista / dict referenciada por el original.
mientras aquí:
está creando una nueva lista / dict que se llena con una copia de las referencias de los objetos contenidos en el contenedor original.
fuente
Toma este ejemplo:
Ahora cambiemos un valor en el nivel 'superficial' (primer):
Ahora cambiemos un valor un nivel más profundo:
fuente
no change in original, since ['a'] is an immutable integer
Esta. En realidad responde a la pregunta formulada.Agregando a la respuesta de kennytm. Cuando hace una copia superficial parent.copy (), se crea un nuevo diccionario con las mismas claves, pero los valores no se copian, se hace referencia a ellos. Si agrega un nuevo valor a parent_copy , no afectará a parent porque parent_copy es un diccionario nuevo. No referencia.
El valor hash (id) de parent [1] , parent_copy [1] es idéntico, lo que implica [1,2,3] de parent [1] y parent_copy [1] almacenados en id 140690938288400.
Pero el hash de parent y parent_copy son diferentes, lo que implica que son diccionarios diferentes y parent_copy es un nuevo diccionario que tiene valores de referencia a los valores de parent
fuente
"nuevo" y "original" son dictos diferentes, por eso puede actualizar solo uno de ellos. Los elementos se copian a poca profundidad, no el dict en sí.
fuente
El contenido se copia poco profundo.
Entonces, si el original
dict
contiene unolist
u otrodictionary
, si modifica uno de ellos en el original o su copia superficial los modificará (ellist
o eldict
) en el otro.fuente
En su segunda parte, debe usar
new = original.copy()
.copy
Y=
son cosas diferentes.fuente