ayuda xq mi lista original cambia si modifiqué la copia?? (es tarea, lo admito)
Emiliano Cruz@emiliano_06
q onda, es para una tarea de estructuras de datos, no quiero q me la hagan solo entender q pasa jsjsjs
matriz = [[0, 0], [0, 0]]
copia = matriz
copia[0][0] = 5
print(matriz) # [[5, 0], [0, 0]] ??????
despues lei q se usa .copy() y lo cambie:
copia = matriz.copy()
copia[0][0] = 5
print(matriz) # [[5, 0], [0, 0]] OTRA VEZ alv
xq pasa esto si ya use copy?? el profe dijo algo de "referencias" pero no le entendi
Accepted answer
jaja bienvenido al club, a todos nos pasó wey. Va explicado:
En Python las variables son etiquetas que apuntan a objetos, no cajas. Cuando haces copia = matriz, las dos etiquetas apuntan a LA MISMA lista.
Con matriz.copy() sí creas una lista nueva... pero es una copia superficial (shallow): la lista de afuera es nueva, pero adentro sigue teniendo LAS MISMAS listas internas. Entonces copia[0] y matriz[0] son el mismo objeto.
Puedes comprobarlo:
print(copia is matriz) # False
print(copia[0] is matriz[0]) # True, aquí está el problema
Soluciones:
import copy
copia = copy.deepcopy(matriz)
o para una matriz de números:
copia = [fila.copy() for fila in matriz]
Y ojo con esta trampa que sale en exámenes: matriz = [[0] * 2] * 2 también crea dos filas que son la misma lista. Mejor [[0] * 2 for _ in range(2)].
Get the best of #codigo_en_espanol weekly
One email each Monday with the most useful posts. No spam; unsubscribe in one click.
Comments
Sign in to join the conversation.
Sign in to commentAccepted answer
Luis Treviño@luis_qa_mty
jaja bienvenido al club, a todos nos pasó wey. Va explicado:
En Python las variables son etiquetas que apuntan a objetos, no cajas. Cuando haces copia = matriz, las dos etiquetas apuntan a LA MISMA lista.
Con matriz.copy() sí creas una lista nueva... pero es una copia superficial (shallow): la lista de afuera es nueva, pero adentro sigue teniendo LAS MISMAS listas internas. Entonces copia[0] y matriz[0] son el mismo objeto.
Puedes comprobarlo:
print(copia is matriz) # False
print(copia[0] is matriz[0]) # True, aquí está el problema
Soluciones:
import copy
copia = copy.deepcopy(matriz)
o para una matriz de números:
copia = [fila.copy() for fila in matriz]
Y ojo con esta trampa que sale en exámenes: matriz = [[0] * 2] * 2 también crea dos filas que son la misma lista. Mejor [[0] * 2 for _ in range(2)].
Emiliano Cruz@emiliano_06
NO MANCHES ya entendi!! lo de 'etiquetas no cajas' me hizo click. y lo de [[0]*2]*2 justo lo tenia en otro ejercicio jsjsjs gracias luis
Sofía Ramírez@sofi_dev_mx
Qué buena explicación Luis 💜 Emi, el is para comprobar si dos cosas son el mismo objeto te va a servir muchísimo para debuggear. Y qué bien que dices que es tarea, así da gusto ayudar
Emiliano Cruz@emiliano_06
gracias sofi!! oye y una pregunta q no tiene q ver, tu crees q algun dia pueda ganar en dolares como tu? voy en 3er semestre y todavia no se ingles bien
Sofía Ramírez@sofi_dev_mx
Claro que sí Emi! yo en 3er semestre tampoco sabía inglés jaja. Termina bien la carrera, practica inglés 20 minutos diarios (series con subtítulos en inglés cuentan) y haz proyectos. Cuando vayas en 6to platicamos del CV 💜
Rosa Quispe@rosa_aprende
Gracias por preguntar Emi, yo tampoco sabía lo de deepcopy. Ya lo anoté en mi cuaderno pe 😊
Emiliano Cruz@emiliano_06
rosa ya somos 2 aprendiendo jsjs seguimos con el hilo de estudio el sabado?
Núria Puig@nuria_data
Bon dia! Data scientist here: the same bug happens with pandas. df2 = df is the same object, use df.copy() instead. Molt bona pregunta 😊