Lo que está experimentando es el concepto de referencias. Todos los objetos en Python tienen una referencia y cuando asigna uno o dos nombres a
y b
, esto da como resultado a
y b
apuntando al mismo objeto .
>>> a = range(3)
>>> b = a # same object
>>> b.append(3)
>>> a, b # same contents
([0, 1, 2, 3], [0, 1, 2, 3])
Con las listas, puede hacer que crear una nueva lista b
que es una copia de otro 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])
Para una solución más general para cualquier objeto, utilice el copy module. Una copia superficial copiará las referencias almacenadas dentro del objeto que está copiando, mientras que una copia profunda hará de forma recursiva copias nuevas de todos los objetos.
>>> 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]])
Bueno, no conoces Python. O al menos no sabes una parte importante de ella, qué variables son. Ver una pregunta similar en SO o, p. Ej. http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#other-languages-have-variables. – delnan
@delnan para ser justos, no es un escollo común para las personas que son nuevas en Python entender que la asignación de variables que involucra listas asigna referencias, aunque el reclamo "Pensé que sabía Python" tiende a indicar que no son "nuevas":) –