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]]
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]]
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]]
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]]