2011-11-14 11 views
15

Mam prosty problem w Pythonie, który jest bardzo dziwny.Skopiowana zmienna zmienia oryginał?

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) 

... 

Jak widać poniżej, matryca matriz zmienia się pomimo faktu, że jest jednym aux zmieniane przez funkcję solucoes().

Matrix wcześniej:
[[7, 8, 9, 24], [8, 9, 10, 27], [9, 10, 8, 27]]

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

Odpowiedz

31

Linia

aux=matriz; 

nie robi kopię matriz, a jedynie tworzy nowe odniesienie do matriz nazwie aux. Prawdopodobnie chcesz

aux=matriz[:] 

co uczyni kopii, zakładając matriz to prosta struktura danych. Jeśli jest to bardziej skomplikowane, powinieneś użyć copy.deepcopy

aux = copy.deepcopy(matriz) 

Tak na marginesie, nie trzeba średników po każdej instrukcji, Python nie używa ich jako markerów EOL.

+0

Witam, dziękuję za odpowiedź =) Ale mam inne pytanie, biorąc pod uwagę ten fakt: jeśli b = 1 i a = b, jeśli zmienimy a = 3, b nie zmienia się w pythonie. Czemu? Thanks =) –

+4

Ponieważ zmieniasz 'a', aby wskazywał na inny obiekt (liczbę całkowitą' 3'), ale nie zmieniasz 'b', więc nadal wskazuje na' 1'. – kindall

2

aux jest nie kopia matrix, to po prostu inna nazwa, która odnosi się do tego samego obiektu.

Użyj obiektu copy module, aby utworzyć rzeczywiste kopie swoich obiektów.

9

użyć modułu copy

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

Minor jeden: średniki nie są potrzebne.

+0

Dzięki za odpowiedź =) –

+1

Witamy w stackoverflow @ AndréFreitas. Zwykle w tym przypadku za dobrą praktykę społeczną uznaje się jedną z odpowiedzi (jedną, która Twoim zdaniem jest najlepsza, niekoniecznie moja). – Shekhar

Powiązane problemy