Cambiar una lista inesperadamente cambia a otra también

Tengo una lista del formulario

v = [0,0,0,0,0,0,0,0,0] 

En algún lugar del código que hago

 vec=v vec[5]=5 

y esto cambia tanto v como vec :

 >>> print vec [0, 0, 0, 0, 0, 5, 0, 0, 0] >>> print v [0, 0, 0, 0, 0, 5, 0, 0, 0] 

¿Por qué v cambia en absoluto?

¿Por qué v cambia en absoluto?

vec yv son ambos punteros. Cuando codificas vec = v, asignas v address a vec. Por lo tanto, cambiar los datos en v también “cambiará” vec.

Si quieres tener dos matrices diferentes usa:

 vec = list(v) 

Porque v apunta a la misma lista que vec está en la memoria.

Si no quieres tener eso tienes que hacer un

 from copy import deepcopy vec = deepcopy(v) 

o

 vec = v[:] 

Para guardar en la memoria, vec será apuntado a la misma matriz a menos que específicamente diga lo contrario.

copiar matrices como esta vec=v[:]


La capacidad de apuntar a una matriz en lugar de copiarla es útil cuando se pasan datos de una función a otra. Si tuvieras esta función

 def foo(): return someBigArray 

Y querías hacer algo con someBigArray

 def bar(): arr = foo() processArray(arr) 

No querrá tener que perder tiempo esperando que el progtwig copie todos los datos en someBigArray para arr, por lo que el comportamiento predeterminado es asignar un puntero a someBigArray.


Una pregunta similar se hizo ¿Cómo clonar o copiar una lista?

podrías usar

 vec=v[:] #but 

“La opinión de Alex Martelli (al menos en 2007) acerca de esto es que es una syntax extraña y no tiene sentido usarla nunca.;) (En su opinión, la siguiente es más legible)”.

 vec=list(v) 

Quiero decir que era el enlace de Erez … ” ¿Cómo clonar o copiar una lista en Python? ”

Ejecute este código y entenderá por qué cambia la variable v.

 a = [7, 3, 4] b = a c = a[:] b[0] = 10 print 'a: ', a, id(a) print 'b: ', b, id(b) print 'c: ', c, id(c) 

Este código imprime la siguiente salida en mi intérprete:

 a: [10, 3, 4] 140619073542552 b: [10, 3, 4] 140619073542552 c: [7, 3, 4] 140619073604136 

Como puede ver, las listas a y b apuntan a la misma ubicación de memoria. Considerando que, la lista c es una ubicación de memoria diferente por completo. Puede decir que las variables ayb son alias para la misma lista. Por lo tanto, cualquier cambio realizado en la variable a o b también se reflejará en la otra lista, pero no en la lista c ¡Espero que esto ayude! 🙂