2011-11-14 37 views
15

Tôi có một vấn đề đơn giản trong Python rất lạ.Biến sao chép thay đổi ban đầu?

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) 

... 

Như bạn thấy bên dưới, ma trận matriz được thay đổi mặc dù thực tế là aux là một trong những bị thay đổi bởi các chức năng solucoes().

Matrix trước:
[[7, 8, 9, 24], [8, 9, 10, 27], [9, 10, 8, 27]]

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

Trả lời

31

Dòng

aux=matriz; 

Không tạo một bản sao của matriz, nó chỉ tạo ra một tài liệu tham khảo mới để matriz tên aux. Bạn có thể muốn

aux=matriz[:] 

Mà sẽ tạo một bản sao, giả sử matriz là một cấu trúc dữ liệu đơn giản. Nếu nó là phức tạp hơn, có lẽ bạn nên sử dụng copy.deepcopy

aux = copy.deepcopy(matriz) 

Là một sang một bên, bạn không cần dấu chấm phẩy sau mỗi lần tuyên bố, trăn không sử dụng chúng như đánh dấu EOL.

+0

Xin chào, cảm ơn câu trả lời của bạn =) Nhưng tôi có một câu hỏi khác xem xét thực tế này: nếu b = 1 và a = b, nếu chúng ta thay đổi a = 3, b không bị thay đổi trong python. Tại sao? Thanks =) –

+4

Vì bạn đang thay đổi 'a' để trỏ đến một đối tượng khác (số nguyên' 3'), nhưng không thay đổi 'b', vì vậy nó vẫn trỏ đến' 1'. – kindall

2

auxkhông một bản sao của matrix, nó chỉ là một cái tên khác mà đề cập đến cùng một đối tượng.

Sử dụng copy module để tạo bản sao thực tế của các đối tượng của bạn.

9

Sử dụng mô-đun copy

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

nhỏ một: dấu chấm phẩy không cần thiết.

+0

Cảm ơn câu trả lời của bạn =) –

+1

Chào mừng bạn đến với stackoverflow @ AndréFreitas. Thông thường ở đây, nó được coi là một thực hành cộng đồng tốt để chấp nhận một trong những câu trả lời (một trong những bạn nghĩ là tốt nhất, không nhất thiết phải của tôi). – Shekhar

Các vấn đề liên quan