Cambiar un elemento en una lista cambia varias listas

Tengo una lista de la lista dice mysolution :

 >>>mySolution [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] >>> mySolution[0][0] = 1 >>> mySolution [[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]] 

Salida prevista:

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

¿Por qué es que todos los primeros elementos en mi lista de listas se están cambiando a 1? Solo me gustaría cambiar el primer elemento de la primera lista a 1.

Lo que importa es cómo creaste tu lista de mysolution original. Parece que contiene cuatro veces la misma lista, por lo que cambiarlo una vez lo hará cambiar en las cuatro ubicaciones.

Para inicializar listas llenas de cero independientes de esa manera, puedes hacer lo siguiente:

 mysolution = [[0] * 4 for i in range(4)] 

Es muy posible que hayas creado la lista así:

 mySolution = [0]*4 mySolution = [mySolution]*4 

O equivalente:

 mySolution = [[0]*4]*4 

Cualquiera de los fragmentos anteriores creará una lista con cuatro sublistas que son copias de la misma sublista exacta , de modo que cualquier modificación en una sublista se reflejará en las demás: son la misma. La solución es crear cuatro sublistas diferentes :

 mySolution = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] 

O un poco más corto:

 mySolution = [[0]*4 for _ in xrange(4)] 

Porque todas las listas contenidas son en realidad la misma lista . Cuando tu lo hagas:

 l = [0, 0, 0, 0] my_solution = [l, l, l] 

Entonces, my_solution[0] , my_solution[1] y my_solution[2] son referencias al mismo objeto ( l ).

Si modifica la lista en una ubicación, cambia en todas partes. Eso es porque las listas son objetos mutables .

En su lugar, utilice varias listas:

 l1 = [0, 0, 0, 0] l2 = [0, 0, 0, 0] l3 = [0, 0, 0, 0] my_solution = [l1, l2, l3] 

Que funcionará según lo previsto.

Tenga en cuenta que esto está haciendo bien:

 mySolution = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] mySolution[0][0] = 1 print mySolution >>> [[1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] 

Todo depende de cómo haya inicializado su solution . esta

 mySolution = [[0, 0, 0, 0]]*4 mySolution[0][0] = 1 print mySolution 

da

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

porque aquí cada matriz [0, 0, 0, 0] en mySolution es una copia de la matriz de inicialización [0, 0, 0, 0] en [[0, 0, 0, 0]]*4 . Si cambia el primer elemento de la primera matriz, también se modificará la copia.

con esta inicialización mySolution = [[0, 0, 0, 0] for x in range(4)] no está copiando la matriz, sino que [0,0,0,0] cuatro veces, lo que da el resultado que espera .