Copias profundas vs superficiales en Python

    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.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *