2012-01-05 16 views
9

Eventuali duplicati:
Python 2D list has weird behavor when trying to modify a single valuepitone di comprensione: la creazione di array 2D

gente,

Mi chiedo se le due seguenti affermazioni sono la stessa cosa?

a = [[0]*3]*3 
b = [[0]*3 for i in range(3)] 

I risultati sono gli stessi. Ma in un modo sarebbe meglio dell'altro? Qual è la differenza qui.

Grazie mille per il vostro aiuto.

nos

+4

Ci sono letteralmente migliaia di domande che riguardano questo argomento esatto ... – JBernardo

risposta

17

non sono la stessa

>>> 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 prima uno crea una matrice esterna di puntatori a un singolo array interno mentre il secondo crea effettivamente 3 array separati.

+1

Stavo scrivendo la * esatta * stessa cosa. +1 a te. – Makoto

+0

sì, nel primo, tutti e tre gli array sono lo stesso oggetto. Se per esempio si usano numeri interi [1] * 5 invece di [[]] * 5, viene utilizzato un nuovo numero intero in ciascuna posizione –

+3

questi non sono array Python ... questi sono elenchi python. – joaquin

7

No, non lo sono.
Nella prima si ha (una lista di) 3 liste identiche, stesso riferimento, nel secondo ci sono tre diversi elenchi

>>> 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. Prova 'a [0] .append (" foo ")'. –

0

Si tratta di un classico caso di bassa-copy vs copia completa, come spiegato here nella documentazione Python :)