Python matrice bidimensionale – la modifica di un elemento

Ho questo 7×7 array bidimensionale:

l=[[1, 1, 1, 1, 1, 1, 1],
  [1, 0, 2, 0, 0, 0, 1],
  [1, 0, 0, 0, 0, 0, 1],
  [1, 0, 0, 0, 0, 0, 1],
  [1, 0, 0, 0, 0, 0, 1],
  [1, 0, 0, 0, 0, 0, 1],
  [1, 1, 1, 1, 1, 1, 1]]

Come si può vedere, l[1][2]=2. Quando si stampa con esso, l’elemento viene stampato correttamente. Nessun problema qui. Ma quando provo a cambiare da “2” e “3” o qualsiasi altro numero, il programma cambia tutti gli elementi a colonna (in questo caso la 3 ° colonna), eccetto il primo e l’ultimo quelli. Per esempio, se scrivo questo codice:

l[1][2]=5

e quindi stampare l’array bidimensionale, ottengo questo:

l=[[1, 1, 1, 1, 1, 1, 1],
  [1, 0, 5, 0, 0, 0, 1],
  [1, 0, 5, 0, 0, 0, 1],
  [1, 0, 5, 0, 0, 0, 1],
  [1, 0, 5, 0, 0, 0, 1],
  [1, 0, 5, 0, 0, 0, 1],
  [1, 1, 1, 1, 1, 1, 1]]

Questo succede con ogni elemento che ho scelto. Invece di cambiare solo elemento, cambia l’intera colonna.
Qualcuno sa quale potrebbe essere il problema? Grazie!

  • Non riproducibile.
  • Io non posso riprodurlo. Si potrebbe si prega di eseguire tutto questo te nell’interprete python? Che python stai usando?
  • Questo non ha senso, anche se si dispone di un NumPy matrice o più riferimenti alla stessa lista. Potrebbe, per favore, ci mostrano un effettivo interprete di sessione?
  • Ci potete mostrare come costruire l’elenco per iniziare? Presumo che per sbaglio sono la memorizzazione di diversi riferimenti alla stessa lista.
  • Probabile, ma ancora non produrre l’output mostrato. Questo è probabilmente perché l’output mostrato non è quello che l’OP effettivamente ottenuto.
  • Sì, dubito fortemente che l’uscita è ciò che OP effettivamente ottenuto. Se non per la prima riga, la lista potrebbe essere stato costruito come l = [a, b, b, b, b, b, c]
  • Ho provato a fare la stessa cosa in un nuovo file e ha funzionato come previsto. Quindi il problema è con il programma a cui sto lavorando. La lista è definita come : l=[[0]*w]*h dove: w, h sono le variabili. All’inizio è un wxh matrice che contiene solo zeri. Poi ho cambiato i margini per l’elemento “1”. La stessa cosa ho fatto nel nuovo file in cui ha funzionato bene. Non so se postare l’intero codice del programma qui sarebbe di aiuto.
  • Ho notato ora che ho fatto un errore nella scrittura dell’uscita. La prima e l’ultima rimangono invariati. Solo le linee in mezzo sono cambiate. Esattamente come @mgilson suggerito. Adesso ho capito qual è il problema e l’ho risolto usando la sua risposta. Grazie.

InformationsquelleAutor Joker | 2014-01-10



2 Replies
  1. 28

    Ho intenzione di prendere una pugnalata a questo, anche se il comportamento che tu descrivi (come tu hai descritto) non è possibile.

    Se si crea un elenco, è necessario assicurarsi che ogni sottoelenco è un elenco diverso. Considerare:

    a = []
    b = [a, a]

    Qui, ho creato una lista in cui entrambe le sottoliste sono esattamente della stessa lista. Se cambio uno, la mostra di entrambi. ad esempio:

    >>> a = []
    >>> b = [a, a]
    >>> b[0].append(1)
    >>> b
    [[1], [1]]

    potrete vedere spesso questo comportamento con un elenco inizializzata con il * operatore:

    a = [[None]*7]*7

    ad esempio

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

    La correzione è quello di non utilizzare il * 7 elenco esterno (l’interno della lista è OK dato che None è immutabile):

    a = [[None]*7 for _ in range(7)]

    ad esempio:

    >>> a = [[None]*7 for _ in range(7)]
    >>> a[0][1] = 3
    >>> a
    [[None, 3, None, None, None, None, None], [None, None, None, None, None, None, None], [None, None, None, None, None, None, None], [None, None, None, None, None, None, None], [None, None, None, None, None, None, None], [None, None, None, None, None, None, None], [None, None, None, None, None, None, None]]
    • Grazie. Questo è il problema. Ho risolto utilizzando il tuo suggerimento.
  2. 2

    Hai costruito la tua lista di sbagliato.

    Medio elementi sono tutti riferiti alla stessa lista, quindi l’aggiornamento causa il cambiamento per essere riflessa negli altri

    Se si mostra il codice che stai usando per costruire la lista, posso mostrarvi come risolvere il problema.

    In alternativa

    l = [sublist[:] for sublist in l]

    prima di iniziare a modificare le liste di separare tutte le nuove liste

Lascia un commento