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. Die Matrix ist 4X3. wie beschrieben Der Einfachheit halber nennen wir die Matrix hier A.
Jetzt möchte ich A11 den Wert 1 zuweisen, indem ich den folgenden Code verwende:
1
alist[ 0][ 0]=1
Dann sollte das gewünschte Ergebnis sein:
1
[[1, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]
Aber leider haben wir Folgendes bekommen:
1
[[1, 1, 2] , [1, 1, 2], [1, 1, 2], [1, 1, 2]]
Was ist los, warum danach? Warum hat sich beim Zuweisen eines Werts zu A21 der andere Ai1 entsprechend geändert?
Der Grund ist folgender:
Wir haben es bereits am Anfang des Artikels gesagt: * Jedes wiederholte Objekt hat die gleiche ID, nämlich die Zeiger auf An derselben Adresse im Speicher müssen Sie beim Betrieb jedes Objekts darauf achten.
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 >>>
Wie Sie sehen können, Die IDs sind alle gleich, was 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]] >>>