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! 🙂