Introducción

En este tutorial, vamos a discutir superficial copias vs profundo copias con la ayuda de ejemplos en Python. Cubriremos la definición de una copia profunda y superficial, junto con su implementación en el lenguaje Python para evaluar las diferencias principales entre los dos tipos de copias.

en muchos de los programas que escribimos, no importa lo básicos que sean, terminamos necesitando copiar una lista o un objeto por una de muchas razones, como la eficiencia computacional., Hay dos maneras de hacer eso, ya sea hacer una copia profunda o una copia superficial. Antes de discutir las diferencias entre los dos, primero entendamos qué son exactamente las copias profundas y superficiales.

copias profundas en Python

una copia profunda hace una copia nueva y separada de un objeto o lista completa con su propia dirección de memoria única. Lo que esto significa es que cualquier cambio que realice en la nueva copia del objeto/lista no se reflejará en la original. Este proceso ocurre primero creando una nueva lista u objeto, seguido de copiar recursivamente los elementos del original al nuevo.,

para decirlo brevemente, ambos objetos son completamente independientes el uno del otro. Esto es similar al concepto de pasar por valor en lenguajes como C++, Java y C#.

ejemplo de copia profunda

para implementar el concepto de copias profundas en Python, utilizaremos el módulo copiar.

digamos que tenemos una lista de listas llamada result_A, que contiene las calificaciones del estudiante A en 3 materias para los dos primeros años de escuela, y deseamos crear una lista exactamente similar de resultados para el estudiante B también., Intentaremos hacer una copia profunda de la lista result_A, y haremos algunos cambios en esa copia profunda más tarde para mostrar las calificaciones del estudiante B.

Ejemplo 1:

en el script anterior, usamos el método deepcopy del método copy módulo para copiar la lista result_A a result_B. A continuación, imprimimos el contenido de ambas listas en la pantalla.

Resultado:

, ], ]

Como puede ver, las listas son idénticos. Más adelante en este artículo veremos cómo esto es diferente de las copias superficiales.,

copias superficiales en Python

una copia superficial también crea un nuevo objeto o lista, pero en lugar de copiar los elementos secundarios al nuevo objeto, simplemente copia las referencias a sus direcciones de memoria. Por lo tanto, si realiza un cambio en el objeto original, se reflejará en el objeto copiado y viceversa. Para decirlo brevemente, ambas copias dependen una de la otra. Esto es similar al concepto de pasar por referencia en lenguajes de programación como C++, C# y Java.,

ejemplo de copia superficial

para implementar esto en Python, usaremos el módulo copyde nuevo, pero esta vez llamaremos a su función copy.

usemos la misma lista de ejemplos para el ejemplo de copia superficial también.

Ejemplo 2:

# Program 2 - Shallow Copyimport copyresult_A = , ]result_B = copy.copy(result_A)print(result_A)print(result_B)

en el script anterior, usamos el método copy del módulo copy para hacer una copia superficial de la lista result_A que hemos nombrado result_B., A continuación, el contenido de ambas listas se ha impreso en la consola.

Resultado:

, ], ]

de Nuevo, las listas son las mismas, como se esperaba. A continuación explicaremos la diferencia entre los resultados que obtenemos de las funciones copy y deepcopy.

diferencia entre copias profundas y superficiales

ahora que hemos discutido qué son las copias superficiales y profundas y por qué creamos copias, es hora de hablar sobre la diferencia entre ellas., Esencialmente, solo hay dos diferencias principales y están vinculadas entre sí:

  1. Deep copy almacena copias de los valores de un objeto, mientras que shallow copy stories hace referencia a la dirección de memoria original
  2. Deep copy no refleja los cambios realizados en el objeto nuevo/copiado en el objeto original; mientras que shallow copy hace

antes de pasar a la implementación, me gustaría que imaginara este escenario. Digamos que dos personas desean compartir una bebida; tienen dos vasos vacíos y dos pajitas., Pueden compartir esta bebida de dos maneras:

  1. poner la bebida en un vaso, y poner ambas pajitas en ese vaso para compartir
  2. poner la bebida en ambos vasos, y poner una pajita en cada vaso

el primer escenario es el de una copia superficial. Ambas variables / instancias están apuntando / usando la misma ubicación de memoria para sus operaciones. El segundo escenario es el de una copia profunda. Ambas variables / instancias están apuntando a / usando dos ubicaciones de memoria diferentes para sus operaciones.,

ejemplo de comparación

para aclarar la diferencia, usemos esta información en nuestros dos ejemplos anteriores, comenzando con el Ejemplo 1.

anteriormente, creamos la lista result_A e hicimos una copia profunda de la misma llamada result_B. Intentemos cambiar el contenido en result_B y veamos si tiene algún efecto sobre el contenido de result_A.

Resultado:

Original List:, ]Deep Copy:, ]

El resultado esperado es que la lista original permanece sin cambios., Y como puede ver, los cambios en la copia profunda no afectaron a la lista original.

Ahora, vamos a intentar lo mismo con el Ejemplo 2-copia superficial.

salida:

Original List:, ]Shallow Copy:, ]

Aquí el resultado esperado es que tanto la lista original como la lista copiada se modifican después del único cambio. Y como puedes ver, hacer el cambio a la copia superficial resultó en que ese cambio se reflejara en la lista original también.

conclusión

en este post, hablamos de lo que es una copia superficial y profunda y cómo podemos hacerlas en lenguaje Python usando el módulo ‘copiar’., Utilizamos dos de sus funciones, es decir, copy y deepcopy para hacer copias superficiales y profundas, respectivamente. Además, discutimos las dos diferencias principales entre una copia superficial y una profunda, y también implementamos una copia superficial y profunda en python para entender esas diferencias de una mejor manera.