Python: los cambios en mi variable de copia afectan la variable original [duplicado]

Resuelto natsuki_2002 asked hace 11 años • 4 respuestas

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_listigual a org_list, se convierten en lo mismo, y si cambio copy_list, org_listtambié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_listen 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.

natsuki_2002 avatar Nov 13 '13 17:11 natsuki_2002
Aceptado

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[:] 
yuvi avatar Nov 13 '2013 10:11 yuvi

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)
Roberto avatar Nov 13 '2013 11:11 Roberto

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)
John La Rooy avatar Nov 13 '2013 10:11 John La Rooy