2011-07-14 6 views

Respuesta

21

Usted ha hecho 3 referencias a la misma lista.

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

que quieres hacer esto:

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

En realidad es la misma lista interna (misma referencia) que se duplica 3 veces, por lo que cuando se modifica cualquiera de ellos, en realidad se está modificando todos ellos.

Por lo tanto, 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.

6

Las listas son mutables y la multiplicación de una lista por un número no copia sus elementos. Usted puede intentar cambiar a una lista por comprensión, por lo que se evaluará [()]*3 tres veces, la creación de tres listas diferentes:

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

También puede escribir como este, que tiene la ventaja de que muestra la estructura [[()]*3]*3

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

También es ligeramente más rápido que el uso distancia. A partir de la cáscara 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 
Cuestiones relacionadas