Quello che stai vivendo è il concetto di riferimenti. Tutti gli oggetti in Python hanno un riferimento e quando si assegnano uno o due nomi a
e b
, questo risulta sia in a
e b
che punta allo stesso oggetto .
>>> a = range(3)
>>> b = a # same object
>>> b.append(3)
>>> a, b # same contents
([0, 1, 2, 3], [0, 1, 2, 3])
Con le liste, è possibile effettuare creare un nuovo elenco b
che è una copia di un altro a
usando b = a[:]
.
>>> a = range(3)
>>> b = a[:] # make b a new copy of a
>>> b.append(3)
>>> a, b # a is left unchanged
([0, 1, 2], [0, 1, 2, 3])
Per una soluzione più generale per qualsiasi oggetto, utilizzare il copy module. Una copia superficiale copierà i riferimenti memorizzati all'interno dell'oggetto che stai copiando, mentre una copia profonda eseguirà ricorsivamente nuove copie di tutti gli oggetti.
>>> a = [range(2), range(3)]
>>> b = copy.copy(a) # shallow copy of a, equivalent to a[:]
>>> b[0] = range(4)
>>> a, b # setting an element of b leaves a unchanged
([[0, 1], [0, 1, 2]], [[0, 1, 2, 3], [0, 1, 2]])
>>> b[1].append(3)
>>> a, b # modifying an element of b modifies the element in a
([[0, 1], [0, 1, 2, 3]], [[0, 1, 2, 3], [0, 1, 2, 3]])
>>> a = [range(2), range(3)]
>>> b = copy.deepcopy(a) # deep recursive copy of a
>>> b[1].append(3)
>>> a, b # modifying anything in b leaves a unchanged
([[0, 1], [0, 1, 2]], [[0, 1], [0, 1, 2, 3]])
Beh, non conosci Python. O almeno non ne conosci una parte importante, quali sono le variabili. Vedi una domanda simile su SO o ad es. http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#other-languages-have-variables. – delnan
@delnan per essere onesti, non è una trappola insolita per chi è nuovo in Python per capire che l'assegnazione variabile che coinvolge le liste assegna riferimenti, anche se l'affermazione "Pensavo di conoscere Python" tende a indicare che non sono "nuovi": –