[Python-es] Problema con listas duplicadas

Eduard Diaz eventgrafic en gmail.com
Vie Ago 5 09:54:56 CEST 2011


Hola,

Para este tipo de problemas lo mejor es usa la interfaz interactiva de
python en consola

Ejemplo de funcionamiento de la copia de listas:

Creamos una lista tipo tauler:
>>> a = [[y for y in range(4)] for x in range(4)]
>>> a
[[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]

Creamos una referencia:
>>> b = a

Comprobamos que si modificamos uno y se modifica en el otro

>>> a[0][1]= 5
>>> a
[[0, 5, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]
>>> b
[[0, 5, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]

Si copiamos la lista:
>>> b=a[:]

Si modificamos un valor de la sublista vemos que tambien se modifica en la
sublista copia
>>> b[0][1]= 8
>>> a
[[0, 8, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]
>>> b
[[0, 8, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]

Pero si añadimos un elemento mas en la lista principal, no se copia!
>>> b.append([x for x in range(4)])
>>> b
[[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]
>>> a
[[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]

Esto es porque si entendemos que el tauler (a) es una lista de listas se
entiende mas
facilmente que hay que duplicar los dos niveles, la lista y la sublista

Duplicamos:
>>> b = [x[:] for x in a]
>>> b
[[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]
>>> a
[[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]

Modificamos:
>>> b[0][1]= 7
>>> b
[[0, 7, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]
>>> a
[[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]

Espero que te sea de ayuda

Un saludo

Eduard Diaz

2011/8/4 Francesc Gispert Sanchez <francesc_gispert_11.12 en hotmail.com>

> Hola, estoy aprendiendo a programar en Python y he intentado hacer una
> versión del juego de mesa 'Othello' sólo con texto. Pero mi problema
> esque la función que cambia las piezas blancas por negras y viceversa no
> funciona, y tras muchas horas probando cosas, me parece que el problema
> viene de la función que duplica la matriz (una lista de listas) que
> representa el tablero.
>
> Esto se puede observar gracias a lo que imprimen las líneas 164 y 165
> del archivo .py; concretamente la 165. Esta línea debería mostrar todo
> el rato el mismo tablero (lista) exacto, puesto que no hay nada dentro
> de la función 'giraFitxes' (giraFichas) que lo modifique. Pero éste va
> adoptando los mismos valores que el tablero provisional que utilizo para
> girar las fichas (el que imprime la línea 164). Por eso, deduzco que
> cuando creo un tablero provisional con la función
> 'duplicaTauler' (duplicaTablero) no se crea una lista nueva, sino que la
> nueva variable es sólo otra referencia al tablero principal.
>
> Además de ésta forma de duplicar el tablero, lo he probado con la
> función descrita en 'http://challenges.qumax.org/?p=351', pero tampoco
> ha funcionado. También lo he intentado con un bucle que recorriera las
> filas y, dentro de éste, 'duplicado = tablero[fila][:]', pero no hay
> forma. Es muy probable que, además de esto, haya algún otro fallo en el
> código, pero si es así no me he percatado por culpa de éste que comento.
>
> Entonces, ¿cómo debería hacerlo para crear un tablero provisional con
> los mismos valores que el tablero original sin que, al modificarlo, se
> modifique también el original?
>
>
> El programa (las variables, los comentarios, etc.) está en catalán,
> espero que no sea una molestia; si lo es, os lo puedo traducir. No sé si
> es relevante, pero utilizo Python 2.6.7 en Debian Wheezy (testing).
>
> Muchas gracias por adelantado.
>
>
> Francesc Gispert
>
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20110805/19e6d8c2/attachment.html>


Más información sobre la lista de distribución Python-es