"copy" --- Operaciones de copia superficial y profunda
******************************************************

**Source code:** Lib/copy.py

======================================================================

Las declaraciones de asignación en Python no copian objetos, crean
enlaces entre un objetivo y un objeto. Para colecciones que son
mutables o que contienen elementos mutables, a veces se necesita una
copia para que uno pueda cambiar una copia sin cambiar la otra. Este
módulo proporciona operaciones genéricas de copia superficial y
profunda (explicadas a continuación).

Resumen de la interfaz:

copy.copy(x)

   Retorna una copia superficial de *x*.

copy.deepcopy(x[, memo])

   Retorna una copia profunda de *x*.

exception copy.Error

   Levantado para errores específicos del módulo.

La diferencia entre copia superficial y profunda solo es relevante
para objetos compuestos (objetos que contienen otros objetos, como
listas o instancias de clase):

* Una copia superficial (*shallow copy*) construye un nuevo objeto
  compuesto y luego (en la medida de lo posible) inserta *references*
  en él a los objetos encontrados en el original.

* Una copia profunda (*deep copy*) construye un nuevo objeto compuesto
  y luego, recursivamente, inserta *copias* en él de los objetos
  encontrados en el original.

A menudo existen dos problemas con las operaciones de copia profunda
que no existen con las operaciones de copia superficial:

* Los objetos recursivos (objetos compuestos que, directa o
  indirectamente, contienen una referencia a sí mismos) pueden causar
  un bucle recursivo.

* Debido a que la copia profunda copia todo, puede copiar demasiado,
  como los datos que deben compartirse entre copias.

La función "deepcopy()" evita estos problemas al:

* mantener un diccionario "memo" de objetos ya copiados durante la
  pasada de copia actual; y

* dejando que las clases definidas por el usuario anulen la operación
  de copia o el conjunto de componentes copiados.

This module does not copy types like module, method, stack trace,
stack frame, file, socket, window, or any similar types.  It does
"copy" functions and classes (shallow and deeply), by returning the
original object unchanged; this is compatible with the way these are
treated by the "pickle" module.

Se pueden hacer copias superficiales de los diccionarios usando
"dict.copy()", y de las listas mediante la asignación de una porción
de la lista completa, por ejemplo, "copied_list = original_list[:]".

Las clases pueden usar las mismas interfaces para controlar la copia
que usan para controlar el *pickling*. Consulte la descripción del
módulo "pickle" para obtener información sobre estos métodos. De
hecho, el módulo "copy" utiliza las funciones de *pickle* registradas
del módulo "copyreg".

Para que una clase defina su propia implementación de copia, puede
definir métodos especiales "__copy__()" y "__deepcopy__()". El primero
se llama para implementar la operación de copia superficial; no se
pasan argumentos adicionales. Este último está llamado a implementar
la operación de copia profunda; se le pasa un argumento, el
diccionario "memo". Si la implementación de "__deepcopy__()" necesita
hacer una copia profunda de un componente, debe llamar a la función
"deepcopy()" con el componente como primer argumento y el diccionario
memo como segundo argumento. El diccionario de notas debe tratarse
como un objeto opaco.

Ver también:

  Módulo "pickle"
     Discusión de los métodos especiales utilizados para apoyar la
     recuperación y restauración del estado del objeto.
