2011-11-14 19 views
15

Ho un semplice problema in Python che è molto molto strano.La variabile copiata cambia l'originale?

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) 

... 

Come si vede sotto, la matrice matriz è cambiato nonostante il fatto che aux è quello di essere cambiato dalla funzione solucoes().

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

Matrix dopo:
[[7, 8, 9, 24], [0.0, -0.14285714285714235, -0.2857142857142847, -0.42857142857142705], [0.0, 0.0, -3.0, -3.0000000000000018]]

risposta

31

La linea

aux=matriz; 

non fa una copia di matriz, si limita a creare un nuovo riferimento alla matriz nome aux. Probabilmente si desidera

aux=matriz[:] 

che farà una copia, assumendo matriz è una semplice struttura di dati. Se è più complessa, probabilmente si dovrebbe usare copy.deepcopy

aux = copy.deepcopy(matriz) 

Per inciso, non hai bisogno di punti e virgola dopo ogni istruzione, pitone non li uso come marcatori di EOL.

+0

Ciao, grazie per la tua risposta =) Ma ho un'altra domanda considerando questo fatto: se b = 1 e a = b, se cambiamo a = 3, il b non è cambiato in python. Perché? Grazie =) –

+4

Poiché stai cambiando 'a' per puntare a un oggetto diverso (il numero intero' 3'), ma non cambiando 'b', quindi punta ancora a' 1'. – kindall

2

aux è non una copia matrix, è solo un nome diverso che si riferisce allo stesso oggetto.

Utilizzare lo copy module per creare copie effettive dei propri oggetti.

9

Usa copy modulo

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

Minore uno: un punto e virgola non sono necessari.

+0

Grazie per la tua risposta =) –

+1

Benvenuto in stackoverflow @ AndréFreitas. Di solito qui, è considerata una buona pratica comunitaria accettare una delle risposte (una che ritieni sia la migliore, non necessariamente la mia). – Shekhar

Problemi correlati