Ho fatto una domanda sull'inizializzazione di un array bidimensionale ieri, questo è il link: Come implementare questo sorgente C ++ in python?
C'è un problema nella risposta, un amico ha menzionato un modo:
G = [[0]*11]*11
Ma in questo modo, quando cambio il G[0][0]
a 2
, tutti i G[i][0](0<=i<11)
cambierà tutto 2
, ma non so perché?
Supplemento:
Questo è quello che pensavo: Il 0
o altro numero è immutable
, quindi cambiamo uno di loro, gli altri non saranno modificati. Ma la lista [0, 0, 0, .....] è mutable
, quindi quando noi [0, 0, ...] * 11, tutta la lista [0, 0, ...] sarà la stessa, come is
la funzione è vera. ho ragione?
risposte:
4 per risposta № 1Perché hai 11 riferimenti alla stessa lista.
G = [[0] * 11 for x in range(11)]
2 per risposta № 2
Il *11
la notazione fa 11 riferimenti allo stesso oggetto. Se l'oggetto è immutabile non te ne accorgi, perché ogni tentativo di cambiarlo cambia il riferimento a un oggetto diverso.Quando l'oggetto è mutabile puoi modificarlo, come assegnarlo a un membro di una lista, poiché tutti i riferimenti sono lo stesso oggetto, tutti vengono modificati allo stesso tempo.
Mutevole / immutabile potrebbe sembrare di cambiare le cose, ma non lo fa - Python è coerente in entrambi i casi. Prendi in considerazione questo esempio:
G[0] = [3]*11
Vedrai che G [1] non è cambiato.