Câu trả lời:
Cả ba phiên bản đều làm những việc khác nhau:
B = A
Điều này liên kết một tên mới B
với đối tượng hiện có đã được đặt tên A
. Sau đó, chúng đề cập đến cùng một đối tượng, vì vậy nếu bạn sửa đổi một đối tượng tại chỗ, bạn cũng sẽ thấy sự thay đổi thông qua đối tượng còn lại.
B[:] = A
(giống như B[:]=A[:]
?)
Điều này sao chép các giá trị từ A
một mảng hiện có B
. Hai mảng phải có cùng hình dạng để điều này hoạt động. B[:] = A[:]
làm điều tương tự (nhưng B = A[:]
sẽ làm điều gì đó giống như 1).
numpy.copy(B, A)
Đây không phải là cú pháp hợp pháp. Có thể bạn muốn nói B = numpy.copy(A)
. Điều này gần giống như 2, nhưng nó tạo ra một mảng mới, thay vì sử dụng lại B
mảng. Nếu không có tham chiếu nào khác đến B
giá trị trước đó , kết quả cuối cùng sẽ giống như 2, nhưng nó sẽ tạm thời sử dụng nhiều bộ nhớ hơn trong quá trình sao chép.
Hoặc có thể ý bạn là numpy.copyto(B, A)
, cái nào là hợp pháp và tương đương với 2?
but B = A[:] would do something more like 1
? Theo stackoverflow.com/a/2612815 new_list = old_list[:]
này cũng là một bản sao.
some_array[:]
sẽ tạo ra một đối tượng mảng mới, nhưng đối tượng mới đó sẽ là một khung nhìn của cùng một bộ nhớ với mảng ban đầu, sẽ không được sao chép. Đó là lý do tại sao tôi nói nó giống hơn B = A
. Nó chỉ cần O(1)
không gian và thời gian, thay vì O(n)
mỗi bản sao thật sẽ cần.
B=A
tạo một tài liệu tham khảoB[:]=A
tạo một bản saonumpy.copy(B,A)
tạo một bản saohai cuối cùng cần thêm bộ nhớ.
Để tạo một bản sao sâu, bạn cần sử dụng B = copy.deepcopy(A)
B[:] = A
không không tạo một bản sao sâu sắc về mảng các đối tượng loại, ví dụ A = np.array([[1,2,3],[4,5]]); B = np.array([None,None], dtype='O')
. Bây giờ hãy thử B[:] = A; B[0][0]=99
, điều này sẽ thay đổi phần tử đầu tiên trong cả A và B ! Theo hiểu biết của tôi, không có cách nào khác để đảm bảo một bản sao sâu, thậm chí của một NumPy mảng, hơncopy.deepcopy