Copias de objetos en Python

copias de objetos en Python

Las copias de objetos en Python puede resultar algo simple y que no hace falta de explicar, pero en determinadas situaciones puede acarrear dolores de cabeza.

Cuando realizamos copias de objetos tenemos dos escenarios posibles:

  • La copia es dependiente del objeto original: si se modifica el original se modifica también la copia.
  • La copia es independiente del objeto original: si se modifica el original no se modifica la copia.

Veamos cómo podemos solucionar ambos casos, para ello utilizaremos un objeto con único atributo que nos servirá para ilustrar algunos ejemplos prácticos, la clase que representa el objeto es la siguiente:

class Test:
    def __init__(self,var):
        self.var = var

    def __str__(self):
        return str(self.var)

Copia dependiente de un objeto en Python

En el siguiente código podemos ver un ejemplo de una copia dependiente:

a = Test('A')
b = a
print(b)
a.var = 'B'
print(b)

Cómo se puede observar en el código anterior se crea una instancia (a) del objeto Test y se iguala un nuevo objeto (b) a la anterior instancia. A continuación, se modifica el atributo de la primera instancia, esto produce que también se modifique el atributo de todas las copias asociadas. Esto se puede comprobar al ejecutar el programa:

A
B

En ambos print se imprime la instancia b, pero antes de la segunda impresión se ha modificado el valor del atributo del objeto original afectando a que es la copia.

Antes de pasar a la copia independiente cabe destacar, que si modificamos una copia también modificaremos el original, vamos a verlo con el siguiente código:

a = Test('A')
b = a
print(a)
b.var = 'B'
print(a)

El código es igual que el del anterior ejemplo, con la diferencia que ahora estamos imprimiendo y modificando b. El resultado es el mismo que antes, con lo cual podemos concluir que a también se modifica al modificar su copia.

Copia independiente de un objeto en Python

Ahora vamos a ver el caso contrario, una copia que no depende del original y viceversa. Para ello, vamos a utilizar una librería de Python (ya incluida por defecto) llamada copyEn el siguiente código veremos cómo usarla:

import copy
a = Test('A')
b = copy.copy(a)
print(b)
a.var = 'B'
print(b)

Simplemente tendremos que importarla y llamar a la función copy. Con esto conseguimos la independencia entre las instancias b, podemos comprobarlo al ejecutarlo:

A
A

En la primera impresión se imprime el valor que tiene originalmente la instancia y en la segunda impresión se imprime lo mismo porque la modificación no ha afectado a la instancia b.

Por último, destacar que si dentro de una clase tenemos declarados otros objetos deberemos utilizar la función deepcopy, para que esos «subobjetos» sean también independientes.


Espero que este artículo te ayude en tus proyectos a realizar copias de objetos en Python según cuál sea tu objetivo. Cualquier duda o sugerencia asociada estaré encantado de responderla 🙂