Comportamiento extraño de la matriz Python

Posible duplicado:
Extraño comportamiento de listas en python.

Estoy intentando inicializar una matriz 2D de 6 por 6 de Ninguno. Esto es lo que hago:

arr = [[None]*6]*6 

Luego bash insertar algunos valores de la siguiente manera:

 arr[2][0] = arr[2][1] = 0 

Lo que, en lugar de cambiar los valores de (2,0) y (2,1) a 0 y mantener el rest de la matriz llena de Ninguno, cambia todas las columnas 0 y 1 a 0.

Ejemplo completo:

 >>> arr = [[None]*6]*6 >>> arr [[None, None, None, None, None, None], [None, None, None, None, None, None], [None, None, None, None, None, None], [None, None, None, None, None, None], [None, None, None, None, None, None], [None, None, None, None, None, None]] >>> arr[2][0] = arr[2][1] = 0 >>> arr [[0, 0, None, None, None, None], [0, 0, None, None, None, None], [0, 0, None, None, None, None], [0, 0, None, None, None, None], [0, 0, None, None, None, None], [0, 0, None, None, None, None]] 

¿Por qué sucede esto y cómo puedo prevenirlo?

ps mi uso de la frase ‘comportamiento extraño’ implica extraño para mí, no Python estropear 🙂

Está creando una matriz con 6 referencias a la matriz original de 6 elementos, pero necesita tener 6 matrices diferentes.

Tratar

 [[None]*6 for i in range(6)] 

Eso creará 6 matrices diferentes.

Cuando dice [None]*6 , se crea una lista de seis valores None . Cuando multiplicas eso por 6 , son seis copias de la misma lista que obtienes. Así que modificar una fila también modificará todas las demás filas de la misma manera.

Puede solucionar este comportamiento haciendo esto (o vea esta pregunta para ver alternativas):

 arr = [[None]*6 for i in xrange(6)]