valor - sentencias en python
Python: los cambios en mi variable de copia afectan la variable original (4)
Cuando escribes
org_list = [''y'', ''c'', ''gdp'', ''cap'']
usted crea el objeto de la lista y le da el nombre "org_list".
Entonces cuando lo haces
copy_list = org_list
simplemente quiere decir que "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 solo es válido si los objetos de la lista son inmutables, porque crea una copia POCO, es decir, la lista se copia, pero cada elemento de la lista no está duplicado.
Si tiene, por ej., Una lista de listas y desea que TODO se duplique, debe realizar una copia DEEP:
import copy
org_list = [''y'', ''c'', [''gdp'', ''rtd''], ''cap'']
copy_list = copy.deepcopy(org_list)
Estoy a tu nivel en el aprendizaje de Python, y estoy (algo así como) escribiendo un blog para arreglar conceptos. Escribirlos me ayuda a entender mejor. Esto es lo que escribí sobre copias superficiales y copias profundas: http://bioruffo.net/lpotf/bindings-shallow-copy-deep-copy/115/
Esta pregunta ya tiene una respuesta aquí:
- Cómo clonar o copiar una lista? 18 respuestas
Tengo una lista para la que creo una copia para hacer algunas manipulaciones sin perder 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é demasiado sobre lo que realmente está sucediendo, pero parece que org_list
realidad se está pasando a copy_list
para que en realidad sean lo mismo.
¿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 otros tipos de variables, por ejemplo, un marco de datos de pandas.
Eso es porque en la configuración de Python, una variable realmente 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[:]
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)
Los nombres de las variables en python son referencias al original. Para hacer una copia, debes ser explicit :
import copy
copy_list = copy.copy(org_list)