Copias profundas vs superficiales en Python

C

Introducción

En este tutorial, vamos a discutir copias superficiales frente a copias profundas 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 centrales entre los dos tipos de copias.

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

Copias profundas en Python

Una copia profunda crea una copia nueva e independiente de un objeto completo o una lista 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 creando primero una nueva lista u objeto, seguido de la copia recursiva de los elementos del original al nuevo.

Para decirlo brevemente, ambos objetos son completamente independientes entre sí. 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, usaremos el Copiar módulo.

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

Ejemplo 1:

# Program 1 - Deep Copy
import copy

result_A = [[90, 85, 82], [72, 88, 90]] # Student A grades
result_B = copy.deepcopy(result_A) # Student B grades (copied from A)

print(result_A)
print(result_B)

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

Salida:

[[90, 85, 82], [72, 88, 90]]
[[90, 85, 82], [72, 88, 90]]

Como puede ver, las listas son idénticas. Más adelante en este artículo veremos en qué se diferencia de las copias superficiales.

Copias superficiales en Python

Una copia superficial también crea un nuevo objeto o una lista por separado, 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 copy módulo de nuevo, pero esta vez llamaremos a su copy función.

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

Ejemplo 2:

# Program 2 - Shallow Copy
import copy

result_A = [[90, 85, 82], [72, 88, 90]]
result_B = copy.copy(result_A)

print(result_A)
print(result_B)

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

Salida:

[[90, 85, 82], [72, 88, 90]]
[[90, 85, 82], [72, 88, 90]]

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

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 centrales y están vinculadas entre sí:

  • La copia profunda almacena copias de los valores de un objeto, mientras que las historias de copia superficial hacen referencia a la dirección de memoria original.
  • La copia profunda no refleja los cambios realizados en el objeto nuevo / copiado en el objeto original; mientras que la copia superficial no

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

  • Ponga la bebida en un vaso y ponga ambas pajitas en ese vaso para compartir.
  • Ponga la bebida en ambos vasos y ponga una pajita en cada vaso.

El primer escenario es el de una copia superficial. Ambas variables / instancias apuntan / usan la misma ubicación de memoria para sus operaciones. El segundo escenario es el de una copia profunda. Ambas variables / instancias apuntan a / usan 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.

Arriba, creamos la lista result_A e hice una copia profunda de ella llamada result_B. Intentemos cambiar el contenido en result_B y ver si tiene algún efecto en el contenido de result_A.

import copy

result_A = [[90, 85, 82], [72, 88, 90]] # Student A grades
result_B = copy.deepcopy(result_A) # Student B grades (copied from A)

# Change first year and first subject's marks to 30
result_B[0][0] = 30

print("Original List: ")
print(result_A)
print("Deep Copy:")
print(result_B)

Salida:

Original List:
[[90, 85, 82], [72, 88, 90]]
Deep Copy:
[[30, 85, 82], [72, 88, 90]]

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

Ahora, intentemos lo mismo con el Ejemplo 2: Copia superficial.

import copy

result_A = [[90, 85, 82], [72, 88, 90]] # Student A grades
result_B = copy.copy(result_A) # Student B grades (copied from A)

# Change first year and first subject's marks to 30
result_B[0][0] = 30

print("Original List: ")
print(result_A)
print("Shallow Copy:")
print(result_B)

Salida:

Original List:
[[30, 85, 82], [72, 88, 90]]
Shallow Copy:
[[30, 85, 82], [72, 88, 90]]

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

Conclusión

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

 

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

Add comment

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con tus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad