Lista 2D ha un comportamento strano quando si cerca di modificare un singolo valore [duplicato]

StackOverflow https://stackoverflow.com/questions/2739552

  •  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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top