Odpowiedzi:
Wszystkie trzy wersje robią różne rzeczy:
B = A
Powoduje to powiązanie nowej nazwy Bz istniejącym już nazwanym obiektem A. Następnie odnoszą się do tego samego obiektu, więc jeśli zmodyfikujesz jeden na miejscu, zobaczysz zmianę również w drugim.
B[:] = A(tak samo jak B[:]=A[:]?)
Spowoduje to skopiowanie wartości z Ado istniejącej tablicy B. Aby to zadziałało, obie tablice muszą mieć ten sam kształt. B[:] = A[:]robi to samo (ale B = A[:]zrobiłby coś bardziej jak 1).
numpy.copy(B, A)
To nie jest legalna składnia. Prawdopodobnie miałeś na myśli B = numpy.copy(A). Jest to prawie to samo, co 2, ale tworzy nową tablicę zamiast ponownie jej używać B. Gdyby nie było innych odniesień do poprzedniej Bwartości, wynik końcowy byłby taki sam jak 2, ale tymczasowo podczas kopiowania zużywałby więcej pamięci.
A może chodziło Ci o to numpy.copyto(B, A), co jest legalne i odpowiada 2?
but B = A[:] would do something more like 1? Według tego stackoverflow.com/a/2612815 new_list = old_list[:] również jest kopią.
some_array[:]utworzy nowy obiekt tablicy, ale ten nowy obiekt będzie widokiem tej samej pamięci, co oryginalna tablica, która nie zostanie skopiowana. Dlatego powiedziałem, że bardziej przypomina B = A. Zajmuje tylko O(1)przestrzeń i czas, a nie wszystko, O(n)czego potrzebowałaby prawdziwa kopia.
B=A tworzy odniesienieB[:]=A tworzy kopięnumpy.copy(B,A) tworzy kopięostatnie dwa wymagają dodatkowej pamięci.
Aby zrobić głęboką kopię, musisz użyć B = copy.deepcopy(A)
B[:] = Aczy nie zrobić głęboki kopii tablic obiektów typu, np A = np.array([[1,2,3],[4,5]]); B = np.array([None,None], dtype='O'). Teraz spróbuj B[:] = A; B[0][0]=99, to zmieni pierwszy element zarówno w A, jak i B ! O ile mi wiadomo, nie ma innego sposobu na zagwarantowanie głębokiej kopii, nawet tablicy numpy, niżcopy.deepcopy