2011-11-14 10 views
15

Tengo un problema simple en Python que es muy, muy extraño.¿La variable copiada cambia el original?

def estExt(matriz,erro): 
    # (1) Determinar o vector X das soluções 
    print ("Matrix after:"); 
    print(matriz); 

    aux=matriz; 
    x=solucoes(aux); # IF aux is a copy of matrix, why the matrix is changed?? 

    print ("Matrix before: "); 
    print(matriz) 

... 

Como que aparece a continuación, la matriz matriz se cambia a pesar del hecho de que aux es el que está siendo cambiado por la función solucoes().

Matrix antes:
[[7, 8, 9, 24], [8, 9, 10, 27], [9, 10, 8, 27]]

matriz después:
[[7, 8, 9, 24], [0.0, -0.14285714285714235, -0.2857142857142847, -0.42857142857142705], [0.0, 0.0, -3.0, -3.0000000000000018]]

Respuesta

31

La línea

aux=matriz; 

no hace una copia de matriz, se limita a crear una nueva referencia al llamado matrizaux. Es posible que desee

aux=matriz[:] 

Qué va a hacer una copia, asumiendo matriz es una estructura de datos simple. Si es más compleja, probablemente debería utilizar copy.deepcopy

aux = copy.deepcopy(matriz) 

Dicho sea de paso, no es necesario un punto y coma después de cada declaración, pitón no los utiliza como marca EOL.

+0

Hola, gracias por su respuesta =) Pero tengo otra pregunta teniendo en cuenta este hecho: si b = 1 y a = b, si cambiamos a = 3, el b no se cambia en python. ¿Por qué? Gracias =) –

+4

Porque está cambiando 'a' para apuntar a un objeto diferente (el entero' 3'), pero no cambia 'b', por lo que aún apunta a' 1'. – kindall

2

aux es no una copia de matrix, es sólo un nombre diferente que se refiere al mismo objeto.

Utilice copy module para crear copias reales de sus objetos.

9

Uso copy módulo

aux = copy.deepcopy(matriz) # there is copy.copy too for shallow copying 

Menor uno: no se necesitan puntos y comas.

+0

Gracias por su respuesta =) –

+1

Bienvenido a stackoverflow @ AndréFreitas. Usualmente aquí, se considera una buena práctica comunitaria aceptar una de las respuestas (una que crees que es la mejor, no necesariamente la mía). – Shekhar

Cuestiones relacionadas