2012-01-05 10 views

Respuesta

17

No son la misma

>>> a[1][2] = 5 
>>> a 
>>> [[0, 0, 5], [0, 0, 5], [0, 0, 5]] 


>>> b[1][2] = 5 
>>> b 
>>> [[0, 0, 0], [0, 0, 5], [0, 0, 0]] 

La primera uno crea una matriz externa de punteros a una única matriz interna, mientras que la segunda en realidad crea 3 matrices separadas.

+1

Estaba escribiendo exactamente * lo mismo. +1 a ti. – Makoto

+0

yup, en la primera, las tres matrices son el mismo objeto. Si usa enteros en su lugar, por ejemplo [1] * 5 en lugar de [[]] * 5, se usa un nuevo entero en cada posición –

+3

, estos no son arreglos de Python ... estas son listas de Python. – joaquin

7

No, no lo son.
En la primera de ellas que tiene (una lista de) 3 listas idénticas, misma referencia, en la segunda tiene tres listas diferentes

>>> a = [[0]*3]*3 
>>> a 
[[0, 0, 0], [0, 0, 0], [0, 0, 0]] 
>>> a[0][0]=1 

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


>>> b = [[0]*3 for i in range(3)] 
>>> b 
[[0, 0, 0], [0, 0, 0], [0, 0, 0]] 
>>> b[0][0] = 1 

>>> b 
[[1, 0, 0], [0, 0, 0], [0, 0, 0]] 
+0

1. Pruebe 'a [0] .append (" foo ")'. –

0

Es un caso clásico de poca profundidad en papel vs copia profunda, como se explica en la documentación here Python :)