Forum >> Principianti >> Creare copia di Lista di numeri per poterci lavorare sopra

Pagina: 1

Ciao a tutti.



Mi sono imbattuto in un problema apparentemente semplice, che mi sta facendo dannare.




Ho una lista di numeri: L = [[1,2,3],[4,5,6,1]]




Devo creare una Funzione che mi restituisca la stessa lista, con alla fine di ogni sottolista, la somma degli elementi TRANNE IL PRIMO.




Ed è proprio qui il problema...o meglio, ho scoperto qualcosa di cui non sapevo nulla:




Nel codice che ho creato, agisco cosî:




- creo una lista provvisoria

- tramite un ciclo for, scandisco la lista originale

- quando "i" ad esempio, vale [1,2,3], rimuovo l'elemento in posizione 0

- faccio la somma di cio che rimane

- "appendo" la somma alla sottolista originaria ([1,2,3])




La cosa che mi sta facendo impazzire è che scopro che ANCHE LA LISTA ORIGINALE è STATA MODIFICATA!!!

La lista originale ora ha come prima sottolista [2,3,5]...quando ci dovrebbe essere anche 1!!!




Come faccio a non modificarla??? (mi sembrava una cosa cosi banale che ho pensato che ci fosse un bug nel mio python...aiuto)





















Ti do un'altra chiave di lettura, forse più facile, usando lo slicing.

>>> l = [7,10,33]
>>> sum(l)
50
>>> sum(l[1:])
43


Semplice e pulito.

Cya

Grazie, dopo un po' di giri sono arrivato anche io alla tua stessa conclusione.



Ma a questo punto il mio dubbio rimane: non credevo che anche associando la lista iniziale ad una variabile x, e modificando una parte di questa lista, anche la lista originaria si modificasse...credevo che una volta associata la lista iniziale ad un'altra variabile, avessi creato una copia di essa.
Ma a questo punto il mio dubbio rimane: non credevo che anche associando la lista iniziale ad una variabile x, e modificando una parte di questa lista, anche la lista originaria si modificasse...credevo che una volta associata la lista iniziale ad un'altra variabile, avessi creato una copia di essa.

In caso di dubbio usa id() per sapere su che cosa stai agendo.
>>> l1 = [7, 10, 33]
>>> id(l1)
140571009816392

>>> l2 = l1
>>> id(l2)
140571009816392

>>> l3 = l1[:]
>>> id(l3)
140571009817096

>>> l4 = list(l1)
>>> id(l4)
140571009747464

>>> l5 = l4.copy()
>>> id(l5)
140571009747016

>>> l1.append(50)
>>> print(l1)
[7, 10, 33, 50]

>>> print(l2)
[7, 10, 33, 50]

>>> print(l3)
[7, 10, 33]

>>> print(l4)
[7, 10, 33]

>>> print(l5)
[7, 10, 33]
Quindi, ricapitolando, se tu fai una semplice assegnazione non avrai due liste distinte, ma avrai due "referenze" (reference) alla stessa lista, quindi l1 ed l2 punteranno alla stessa lista.

Come invece avrai notato, se usi altri metodi come lo slicing, il metodo suggerito da Alex Martelli in Python in a Nutshell (quello di l4) o il copy(), avrai delle nuove liste che non verranno influenzate dalle modifiche di l1.

Spero sia più chiaro.

Cya


Pagina: 1



Esegui il login per scrivere una risposta.