Antworten:
Alle drei Versionen machen unterschiedliche Dinge:
B = A
Dadurch wird ein neuer Name B
an das bereits benannte vorhandene Objekt gebunden A
. Danach beziehen sie sich auf dasselbe Objekt. Wenn Sie also eines an Ort und Stelle ändern, sehen Sie die Änderung auch durch das andere.
B[:] = A
(wie B[:]=A[:]
?)
Dadurch werden die Werte aus A
einem vorhandenen Array kopiert B
. Die beiden Arrays müssen dieselbe Form haben, damit dies funktioniert. B[:] = A[:]
macht das gleiche ( B = A[:]
würde aber eher etwas wie 1 machen).
numpy.copy(B, A)
Dies ist keine legale Syntax. Du hast es wahrscheinlich gemeint B = numpy.copy(A)
. Dies ist fast dasselbe wie 2, erstellt jedoch ein neues Array, anstatt das B
Array wiederzuverwenden. Wenn es keine anderen Verweise auf den vorherigen B
Wert gäbe, wäre das Endergebnis dasselbe wie 2, aber es wird vorübergehend mehr Speicher während des Kopierens verbrauchen.
Oder haben Sie vielleicht gemeint numpy.copyto(B, A)
, was legal ist und 2 entspricht?
but B = A[:] would do something more like 1
? Demnach ist stackoverflow.com/a/2612815 new_list = old_list[:]
auch eine Kopie.
some_array[:]
ausführen, wird ein neues Array-Objekt erstellt. Dieses neue Objekt ist jedoch eine Ansicht desselben Speichers wie das ursprüngliche Array, das nicht kopiert wurde. Deshalb habe ich gesagt, es ist eher so B = A
. Es braucht nur O(1)
Raum und Zeit und nicht die, die O(n)
eine echte Kopie benötigen würde.
B=A
erstellt eine ReferenzB[:]=A
macht eine Kopienumpy.copy(B,A)
macht eine KopieDie letzten beiden benötigen zusätzlichen Speicher.
Um eine tiefe Kopie zu erstellen, müssen Sie verwenden B = copy.deepcopy(A)
B[:] = A
Erstellt keine tiefe Kopie von Arrays vom Objekttyp, z A = np.array([[1,2,3],[4,5]]); B = np.array([None,None], dtype='O')
. Versuchen Sie nun B[:] = A; B[0][0]=99
, dies ändert das erste Element in A und B ! Meines Wissens gibt es keinen anderen Weg, um eine tiefe Kopie zu garantieren, selbst eines Numpy-Arrays, alscopy.deepcopy