Ich versuche langsam, den Unterschied zwischen view
s und copy
s in numpy sowie mutable vs. unveränderlichen Typen zu verstehen.
Wenn ich mit 'erweiterte Indexierung' auf einen Teil eines Arrays zugreife Es soll eine Kopie zurückgeben. Das scheint zu stimmen:
%Vor% Da c
nur eine Kopie ist, teilt sie keine Daten, und wenn sie geändert wird, wird a
nicht mutiert. Das verwirrt mich jedoch:
Es scheint also, selbst wenn ich erweiterte Indizierung verwende, behandelt die Zuweisung das Ding auf der linken Seite immer noch als Ansicht. Offensichtlich ist die a
in Zeile 2 das gleiche Objekt / Daten wie die a
in Zeile 6, da das Ändern von c
keine Auswirkung hat.
Also meine Frage: Ist das a
in Zeile 8 das selbe Objekt / Daten wie vorher (die Diagonale natürlich nicht mitgerechnet) oder ist es eine Kopie? Mit anderen Worten: Wurden die Daten von a
in die neue a
kopiert oder wurden ihre Daten an Ort und Stelle mutiert?
Zum Beispiel ist es so:
%Vor%oder wie:
%Vor% Ich weiß nicht, wie ich das überprüfen soll, denn in jedem Fall ist a.flags.owndata
True
. Bitte zögern Sie nicht, eine andere Frage zu formulieren oder zu beantworten, wenn ich darüber auf verwirrende Weise nachdenke.
Wenn Sie c = a[b]
ausführen, wird a.__get_item__
mit b
als einzigem Argument aufgerufen, und alles, was zurückgegeben wird, wird c
zugewiesen.
Wenn Sie a[b] = c
ausführen, wird a.__setitem__
mit b
und c
als Argumente aufgerufen, und alles, was zurückgegeben wird, wird automatisch verworfen.
Obwohl beide die gleiche a[b]
-Syntax haben, machen beide Ausdrücke verschiedene Dinge. Sie könnten ndarray
ableiten, diese zwei Funktionen überladen und sie sich anders verhalten. Wie standardmäßig in numpy, gibt ersteres eine Kopie zurück (wenn b
ein Array ist), aber letzteres ändert a
an Ort und Stelle.
Ja, es ist das gleiche Objekt. So überprüfen Sie:
%Vor% Das Zuweisen eines Ausdrucks in Python ist nicht dasselbe wie das Lesen des Wertes dieses Ausdrucks. Wenn Sie c = a[b]
mit a[b]
auf der rechten Seite des Gleichheitszeichens eingeben, wird ein neues Objekt zurückgegeben. Wenn Sie a[b] = 1
mit a[b]
auf der linken Seite des Gleichheitszeichens eingeben, wird das ursprüngliche Objekt geändert.
Tatsächlich kann ein Ausdruck wie a[b] = 1
nicht ändern, an welchen Namen a
gebunden ist. Der Code, der obj[index] = value
behandelt, kann nur das Objekt obj
kennen lernen, nicht den Namen, der für dieses Objekt verwendet wurde. Daher kann nicht geändert werden, auf was sich dieser Name bezieht.