Odpowiedzi:
Wszystkie trzy wersje robią różne rzeczy:
B = A
Powoduje to powiązanie nowej nazwy B
z 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 A
do 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 B
wartoś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[:] = A
czy 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