In Python gibt es ein spezielles Symbol „*“, das als Multiplikationsoperator für numerische Operationen und als Wiederholungsoperator für Objekte verwendet werden kann. Bei der Verwendung als Wiederholungsoperator müssen Sie jedoch aufpassen
Hinweis: * Jedes wiederholte Objekt hat dieselbe ID, was bedeutet, dass es auf dieselbe Adresse im Speicher verweist. Sie müssen bei der Bedienung jedes Objekts darauf achten.
Zum Beispiel:
>>> alist = [range(3)]*4 >>> alist [[0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]
Das Obige initialisiert eine zweistufige Liste, um die Matrix zu simulieren. Der Einfachheit halber ist die Matrix. die Matrix wird hier als A aufgezeichnet.
Jetzt möchte ich A11 den Wert 1 zuweisen, indem ich den folgenden Code verwende:
alist[0][0]=1
Dann sollte das gewünschte Ergebnis sein:
[[1, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]
Aber leider bekommen wir Folgendes:
[[1, 1, 2], [1, 1, 2], [1, 1, 2], [ 1, 1, 2]]
Warum ist der Wert A21 zugewiesen und warum ändern sich andere Ai1s entsprechend?
Der Grund ist folgender:
Wir haben es bereits am Anfang des Artikels gesagt * Jedes wiederholte Objekt hat dieselbe ID, was bedeutet, dass es auf dieselbe Adresse im Speicher verweist. Sie müssen bei der Bedienung jedes Objekts aufmerksam sein.
Wir haben bei der Initialisierung den Wiederholungsoperator „*“ verwendet. Wenn dieser Operator Operationen an Objekten wiederholt, verweist er alle wiederholten Objekte auf dieselbe Speicheradresse. Wenn Sie also einen Wert ändern,
Andere Werte werden natürlich aktualisiert. Die Erklärung in Python ist der folgende Befehl und die folgende Ausgabe:
>>> id(alist[0]) 18858192 >>> id(alist[1]) 18858192 >>> id(alist[2]) 18858192 >>> id(alist[3]) 18858192 >>>
Siehe es, id Sie sind alle gleich bedeutet, dass diese 4 Listen dieselbe „Liste“ sind.
Was sollen wir in diesem Fall tun, wenn wir eine Matrix simulieren möchten? Zusätzlich zum speziellen Numpy-Paket können Sie natürlich nacheinander neue Listen an die Liste der oberen Ebene anhängen, zum Beispiel:
>>> blist=[] >>> for i in range(4): blist.append([j for j in range(3)]) >>> blist [[0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]
Auf diese Weise versuchen wir den obigen Zuweisungsvorgang noch einmal:
>>> blist[0][0]=1 >>> blist [[1, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]] >>>