miércoles, 15 de marzo de 2017

Copiar matrices y listas en python 2.7 (Parte 1)

Como parte de mi aprendizaje en informática me ha tocado acercarme al lenguaje de programación Python, la mayoría de mi experiencia la tengo programando microcontroladores en C, así que este nuevo lenguaje me ha traido algunos problemas para acostumbrarme.

A pesar de que el uso de un intérprete para correr los programas trae muchos beneficios, a veces tendemos a abusar de estos. Para mí un caso en particular fue la copia de listas y matrices.

Listas

A veces se puede tener la mala idea de utilizar la siguiente expresión al querer copiar una lista:

>>> listaA=[1,2,3]
>>> listaB=listaA
>>> print listaA, listaB
[1, 2, 3] [1, 2, 3]

A pesar de que ambas listas tienen los mismos valores, lo que hicimos en este caso no fue copiar, sino, referenciar listaB a listaA. De esta manera al modificar valores en cualquier lista se cambiarán en la otra.

>>> listaB[2]=99
>>> listaA[0]=33
>>> print listaA, listaB
[33, 2, 99] [33, 2, 99]

Podemos ver también que la función id( ) nos retorna la misma referencia. Aunque si eliminamos una lista la otra seguirá existiendo.

>>> id(listaA)
43148296L
>>> id(listaB)
43148296L
del listaA
print listaB
[33, 2, 99]

Hay variadas formas de copiar una lista Python para que al hacer cambios en una no se afecte a la otra. Primero devolvemos listaA a los valores iniciales y luego copiamos.

>>> del listaA
>>> listaA=[1,2,3]
>>> print listaA
[1, 2, 3]
>>> listaB=listaA[:]
>>> listaC=list(listaA)
>>> import copy
>>> listaD=copy.copy(listaA)
>>> listaE=copy.deepcopy(listaA)
>>> listaA[0]=99
>>> print listaA,',',listaB,',',listaC,',',listaD,',',listaE
[99, 2, 3] , [1, 2, 3] , [1, 2, 3] , [1, 2, 3] , [1, 2, 3]

De esta manera, al hacer cambios en listA no afecta a sus copias.

En internet hay más información acerca de cada una de estas funciones. En la siguiente entrada tocaré el tema de las matrices o arrays.

No hay comentarios:

Publicar un comentario