2009-12-24 18 views
10

pitón:lista de Python problema

m=[[0]*3]*2 
for i in range(3): 
    m[0][i]=1 

print m 

espero que este código debe imprimir

[[1, 1, 1], [0, 0, 0]] 

pero imprime

[[1, 1, 1], [1, 1, 1]] 

Respuesta

14

Esto es por diseño. Cuando usa multiplicación en elementos de una lista, está reproduciendo las referencias.

Consulte the section "List creation shortcuts" on the Python Programming/Lists wikibook que detalla los problemas con la lista de referencias a objetos mutables.

Su solución recomendada es una lista por comprensión:

>>> s = [[0]*3 for i in range(2)] 
>>> s 
[[0, 0, 0], [0, 0, 0]] 
>>> s[0][1] = 1 
>>> s 
[[0, 1, 0], [0, 0, 0]] 
6

Esto es un poco diabólica, pero bastante obvio cuando usted entiende lo que está haciendo. cuando haces el bit [[0]*3]*2, primero estás creando una lista con 3 ceros, y luego la copias para formar dos elementos. Pero cuando haces esa copia, no creas listas nuevas con los mismos contenidos, sino que haces referencia a la misma lista varias veces. Entonces, cuando cambias uno, todos cambian.

Un ejemplo para resaltarlo:

In [49]: s = [[]]*2 # Create two empty lists 

In [50]: s # See: 
Out[50]: [[], []] 

In [51]: s[0].append(2) # Alter the first element (or so we think) 

In [52]: s # OH MY, they both changed! (because they're the same list!) 
Out[52]: [[2], [2]]