Lista 2D ha un comportamento strano quando si cerca di modificare un singolo valore [duplicato]
-
02-10-2019 - |
Domanda
Eventuali duplicati:
in un elenco di liste Python
Quindi io sono relativamente nuovo per Python e sto avendo problemi con lavoro liste 2D.
Ecco il mio codice:
data = [[None]*5]*5
data[0][0] = 'Cell A1'
print data
e qui è l'uscita (formattato per migliorare la leggibilità):
[['Cell A1', None, None, None, None],
['Cell A1', None, None, None, None],
['Cell A1', None, None, None, None],
['Cell A1', None, None, None, None],
['Cell A1', None, None, None, None]]
Perché ogni riga ottenere assegnato il valore?
Soluzione
Questo rende una lista con cinque riferimenti alla stesso :
data = [[None]*5]*5
Usa qualcosa come questo, invece che crea cinque elenchi distinti:
>>> data = [[None]*5 for _ in range(5)]
Ora si fa quello che ci si aspetta:
>>> data[0][0] = 'Cell A1'
>>> print data
[['Cell A1', None, None, None, None],
[None, None, None, None, None],
[None, None, None, None, None],
[None, None, None, None, None],
[None, None, None, None, None]]
Altri suggerimenti
Come la python di riferimento libreria per i tipi di sequenze , che comprende gli elenchi, dice
Si noti inoltre che le copie sono poco profonde; strutture nidificate non vengono copiati. Questo tormenta spesso nuovi programmatori Python; prendere in considerazione:
>>> lists = [[]] * 3
>>> lists
[[], [], []]
>>> lists[0].append(3)
>>> lists
[[3], [3], [3]]
È successo che [[]] è una lista di un elemento contenente un elenco vuoto, quindi i tre elementi di [[]] * 3 sono (puntatori a) questa lista unica vuota. Modifica qualsiasi degli elementi di liste modifica questa singola lista.
È possibile creare un elenco di diverse liste in questo modo:
>>> lists = [[] for i in range(3)]
>>> lists[0].append(3)
>>> lists[1].append(5)
>>> lists[2].append(7)
>>> lists
[[3], [5], [7]]
In pitone ogni variabile è un oggetto, e così un riferimento. Hai creato una serie di 5 Nones, e poi si costruisce un array con 5 volte lo stesso oggetto.