two multiply lists all python list multiplication

multiply - Multiplicación de la lista de Python:[[...]]*3 hace 3 listas que se reflejan entre sí cuando se modifican



multiply two lists python (4)

En realidad, es la misma lista interna (misma referencia) que se duplica 3 veces, por lo que cuando modificas una de ellas, en realidad las estás modificando.

Entonces, la lista interna [()]*3 produce una lista de tres tuplas. Pero luego esta lista se duplica tres veces. Sin embargo, en python, es realmente una lista de referencias que se multiplica, por lo que la referencia se duplica, pero cada referencia aún apunta a la misma lista subyacente.

Esta pregunta ya tiene una respuesta aquí:

¿Por qué está pasando esto? Realmente no entiendo:

>>> P = [ [()]*3 ]*3 >>> P [[(), (), ()], [(), (), ()], [(), (), ()]] >>> P[0][0]=1 >>> P [[1, (), ()], [1, (), ()], [1, (), ()]]


Has hecho 3 referencias a la misma lista.

>>> a = b = [] >>> a.append(42) >>> b [42]

Quieres hacer esto:

P = [[()] * 3 for x in range(3)]


Las listas son mutables y multiplicar una lista por un número no copia sus elementos. Puede intentar cambiarlo a una lista de comprensión, por lo que evaluará [()]*3 tres veces, creando tres listas diferentes:

P = [ [()]*3 for i in range(3) ]


También puede escribirlo así, que tiene la ventaja de mostrar la estructura [[()]*3]*3

>>> P=[i[:] for i in [[()]*3]*3] >>> P[0][0]=1 >>> P [[1, (), ()], [(), (), ()], [(), (), ()]

También es un poco más rápido que usar el rango. Desde el shell ipython:

In [1]: timeit P = [ [()]*3 for i in range(3) ] 1000000 loops, best of 3: 1.41 us per loop In [2]: timeit P=[i[:] for i in [[()]*3]*3] 1000000 loops, best of 3: 1.27 us per loop