Breaking

Post Top Ad

Your Ad Spot

viernes, 14 de junio de 2019

Copias profundas y superficiales en Python

Introducción

En este tutorial, vamos a discutir las copias poco profundas frente a las 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 principales entre los dos tipos de copias.
En muchos de los programas que escribimos, sin importar qué tan básicos sean, terminamos necesitando copiar una lista o un objeto por una de muchas razones, como la eficiencia computacional. Hay dos formas de hacerlo, 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 en profundidad hace 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 al crear 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 en profundidad en Python, usaremos el módulo de copia .
Digamos que tenemos una lista de listas llamadas result_A, que contiene las calificaciones del estudiante A en 3 materias para los primeros dos años de la escuela, y deseamos crear una lista de resultados exactamente similar para el estudiante B. Trataremos de hacer una copia profunda de la result_Alista, y haremos 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 deepcopymétodo del copymódulo para copiar la lista result_Aresult_BA continuación, imprimimos los contenidos de ambas listas en la pantalla.
Salida:
[[90, 85, 82], [72, 88, 90]]
[[90, 85, 82], [72, 88, 90]]
Como puedes ver, las listas son idénticas. Más adelante en este artículo veremos en qué se diferencia esto de las copias superficiales.

Copias poco profundas en Python

Una copia superficial también crea un nuevo objeto o lista de objetos, 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 copymódulo nuevamente, pero esta vez llamaremos su copyfunción.
Usemos la misma lista de ejemplos para el ejemplo de copia superficial también.
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 copymétodo del copymódulo para hacer una copia superficial de la lista result_Aque nombramos result_BA continuación, los contenidos de ambas listas se han 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 de las funciones copydeepcopy.

Diferencia entre copias profundas y poco profundas

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. 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
  2. La copia profunda no refleja los cambios realizados en el objeto nuevo / copiado en el objeto original; mientras que, copia superficial 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. Ponga la bebida en un vaso y ponga ambas pajitas en ese vaso para compartir
  2. Ponga la bebida en ambos vasos y ponga una pajilla 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 están apuntando a / usando dos ubicaciones de memoria diferentes para sus operaciones.

Ejemplo de comparación

Para dejar clara la diferencia, usemos esta información en nuestros dos ejemplos anteriores, comenzando con el Ejemplo 1 .
Arriba, creamos la lista result_Ae hicimos una copia detallada de la misma result_BIntentemos cambiar el contenido result_By 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 permanece 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 modifican después del único cambio. Y como puede ver, al hacer el cambio en la copia superficial, el cambio también se refleja en la lista original.

Conclusión

En esta publicación, hablamos sobre qué 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, copydeepcopypara hacer copias poco profundas y profundas, respectivamente. Además, discutimos las dos diferencias principales entre una copia superficial y otra profunda, y también implementamos una copia superficial y profunda en python para comprender esas diferencias de una manera mejor.

No hay comentarios.:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

Post Top Ad

Your Ad Spot

Páginas