Foros del Web » Programando para Internet » Python »

¿Que utilidad tiene el método copy en listas?

Estas en el tema de ¿Que utilidad tiene el método copy en listas? en el foro de Python en Foros del Web. Pues eso. Yo no se la logro ver o no la entiendo. Por lo que he leído hace una copia superficial de la lista. Es ...
  #1 (permalink)  
Antiguo 13/09/2014, 07:42
 
Fecha de Ingreso: diciembre-2009
Ubicación: Spain
Mensajes: 180
Antigüedad: 14 años, 4 meses
Puntos: 9
¿Que utilidad tiene el método copy en listas?

Pues eso. Yo no se la logro ver o no la entiendo. Por lo que he leído hace una copia superficial de la lista. Es mas, en la mayoría de sitios donde explican los métodos de las listas, suelen pasarla por alto. Tanto el método copy() como el método clear().

Por ejemplo:

Código Python:
Ver original
  1. lista = [1,2,3,4,5]
  2. lista.copy()
  3. [1, 2, 3, 4, 5]

Código Python:
Ver original
  1. copia = lista.copy()
  2. copia
  3. [1, 2, 3, 4, 5]

Pero también se puede hacer sin ese método ¿No?

Código Python:
Ver original
  1. lista = [1,2,3,4,5]
  2. copia = lista
  3. copia
  4. [1, 2, 3, 4, 5]
  #2 (permalink)  
Antiguo 13/09/2014, 09:48
 
Fecha de Ingreso: mayo-2013
Mensajes: 207
Antigüedad: 10 años, 11 meses
Puntos: 31
Respuesta: ¿Que utilidad tiene el método copy en listas?

Si usas, tras asignar las variables
Código Python:
Ver original
  1. lista.append(6)
y luego miras el valor de lista y copia en los dos casos. Verás si hacen lo mismo o no.
  #3 (permalink)  
Antiguo 13/09/2014, 12:30
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: ¿Que utilidad tiene el método copy en listas?

Esto es muy simple una vez que entiendes el concepto de inmutabilidad.

Definición:
Cita:
Iniciado por Wikipedia
un «objeto inmutable» es un objeto cuyo estado no puede ser modificado una vez creado.
Algunos puntos a tener en cuenta:
1. En python todo es un objeto.
2. En python puedes clasificar cualquier objeto como inmutable o mutable.

Ejemplos de objetos mutables:
Listas, Diccionarios, Sets

Ejemplos de objetos inmutables:
Enteros, Flotantes, Cadenas, Tuplas, Frozensets

Mas ejemplos de inmutabilidad.
Código Python:
Ver original
  1. my_str = " ola mundo"
  2. my_str[0] = "H"
  3. # TypeError: 'str' object does not support item assignment
Como puedes ver, esto arrojara una excepción de tipo TypeError. Por que como dije arriba las cadenas son inmutables.

Código Python:
Ver original
  1. my_list = [0, 2, 3]
  2. my_list[0] = 1
Y aquí no hay ningún error. Y funciona porque nuestro objeto es mutable. Y como puedes ver, paso de tener [0, 2, 3] a tener [1, 2, 3].

¿Bueno y que tiene que ver esto con deep copy o swallow copy?
Primero vamos a ver que pasa, si no aplicamos una copia.

Código Python:
Ver original
  1. a = [1, 2, 3]
  2. print a # [1, 2, 3]
  3. b = a # Esto es una referencia a la lista a, no es una copia
  4. del b[0]
  5. print a # [2, 3] modifico nuestra lista a
  6. print b # [2, 3]

¿Como puedo evitar esto si no existiera un método copy?
Fácil creas una copia manualmente.
Código Python:
Ver original
  1. def copy(some_list):
  2.     copy_list = []
  3.     for item in some_list:
  4.         copy_list.append(item)
  5.     return copy_list
  6.  
  7. a = [1, 2, 3]
  8. b = copy(a)
  9. del b[0]
  10. print a # [1, 2, 3]
  11. print b # [2, 3]
Como puedes ver es perfectamente y crea una copia. Pero esto es un swallow copy.

¿Pero que tal si tengo objetos inmutables anidados?
Código Python:
Ver original
  1. a = [[1, 2], [3, 4]]
  2. b = copy(a)
  3. del b[0]
  4. print a # [[1, 2], [3, 4]]
  5. print b # [[3, 4]]
  6. # Funciona perfecto
  7.  
  8. del b[0][0]
  9. print a # [[1, 2], [4]]
  10. print b # [[4]]
  11. # WTF!
Ok, ¿Que paso aquí?
Es bastante fácil, cuando creo una copia de la lista, asumo que todos los objetos de la lista son inmutables. Cosa que en la vida real no es así.

Para evitar esto, existe algo llamado deep copy. Que hará una copia, no importa los niveles de anidamiento que tengas.

Mas información al respecto, puedes leer la documentación. https://docs.python.org/2/library/copy.html

Etiquetas: copy
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:47.