Python: los cambios en mi variable de copia afectan la variable original [duplicado]
Tengo una lista de la que creo una copia para poder realizar algunas manipulaciones y al mismo tiempo conservar la lista original. Sin embargo, cuando configuro copy_list
igual a org_list
, se convierten en lo mismo, y si cambio copy_list
, org_list
también cambia. Por ejemplo:
org_list = ['y', 'c', 'gdp', 'cap']
copy_list = org_list
copy_list.append('hum')
print(copy_list)
print(org_list)
devoluciones
['y', 'c', 'gdp', 'cap', 'hum']
['y', 'c', 'gdp', 'cap', 'hum']
No sé mucho sobre lo que realmente está pasando, pero parece que org_list
en realidad se está transmitiendo acopy_list
por lo que en realidad son la misma cosa.
¿Hay alguna manera de hacer una copia independiente de org_list sin hacer algo torpe como:
copy_list = []
for i in org_list:
copy_list.append(i)
Digo esto porque tengo el mismo problema con otro tipo de variables, por ejemplo un dataframe de pandas.
Esto se debe a que al configurar Python, una variable en realidad establece una referencia a la variable. Casi todas las personas que aprenden Python se encuentran con esto en algún momento. La solución es simplemente copiar la lista:
copy_list = org_list[:]
Cuando escribes
org_list = ['y', 'c', 'gdp', 'cap']
creas el objeto de lista y le das el nombre "org_list".
Entonces cuando lo hagas
copy_list = org_list
solo quieres decir "el nombre copy_list se refiere al mismo objeto que org_list".
Si su lista solo contiene tipos inmutables, puede crear una copia
copy_list = list(org_list)
Pero tenga en cuenta que esto sólo es válido si los objetos de la lista son inmutables, porque crea una copia SUPERFICIAL, es decir, la lista se copia, pero no se duplican todos los elementos de la lista.
Si tiene, es decir, una lista de listas y desea que TODO se duplique, debe realizar una copia PROFUNDA:
import copy
org_list = ['y', 'c', ['gdp', 'rtd'], 'cap']
copy_list = copy.deepcopy(org_list)
Esto es solo copiar la referencia.
copy_list = org_list
Deberías usar
copy_list = org_list[:] # make a slice that is the whole list
o
copy_list = list(org_list)