Seien Sie vorsichtig mit dem *doppelten Zeichen (Operator) in Python

高洛峰
Freigeben: 2016-10-18 09:58:27
Original
978 Leute haben es durchsucht

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]]
Nach dem Login kopieren

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
>>>
Nach dem Login kopieren

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]]
Nach dem Login kopieren

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]]
>>>
Nach dem Login kopieren


Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage