Zweidimensionale Python-Array-Falle [Kopie des Arrays]

Es ist eine grundlegende Sache, aber ich stecke fest, weil ich es nicht verstehe, also mach dir eine Notiz.

Vorwort

Das Erstellen eines Arrays mit Python ist einfach und nett.

a = [0] * 2
print(a) # [0, 0]

Lassen Sie uns auch ein zweidimensionales Array erstellen.

b = [[0] * 2] * 2
print(b) # [[0, 0], [0, 0]]

Oh praktisch. Lass es uns bedienen.

b[0][1] = 1

Lass es uns drucken.

print(b) #[[0, 1], [0, 1]]

Hmm? ?? ?? ?? ?? ??

Fazit

Lass uns das schreiben.

c = [[0] * 2 for i in range(2)]
print(c) # [[0, 0], [0, 0]]
c[0][1] = 1
print(c) # [[0, 1], [0, 0]]

Warum nicht?

Verwenden wir die Funktion id ().

b = [[0] * 2] * 2
print(id(b[0])) # 1835216839944
print(id(b[1])) #1835216839944 Gleiche Adresse
c = [[0] * 2 for i in range(2)]
print(id(c[0])) # 1835216058120
print(id(c[1])) #1835216840392 Andere Adresse

Wenn Sie mit * 2 kopieren, verweisen Sie auf dieselbe Adresse.

Wenn Sie den "Inhalt", auf den sich die Adresse bezieht, in Form von b [0] [1] = 1 ändern, wird dies in allen Arrays angezeigt, die die Adresse gemeinsam nutzen.

Warum passiert das nicht mit einem eindimensionalen Array?

Dieses Phänomen tritt bei einem eindimensionalen Array nicht auf, oder?

a = [0] * 2
a[0] = 1
print(a) # [1, 0]

Schauen wir uns die Adresse an.

a = [0] * 2
print(a[0] == a[1]) # True
a[0] = 1
print(a[0] == a[1]) # False
print(a) # [1, 0]

Es hatte dieselbe Adresse, als es zum ersten Mal kopiert wurde, aber als [0] = 1 zugewiesen wurde, änderte sich die Adresse.

Dies ist der Unterschied zwischen unveränderlichen (unveränderlichen) und veränderlichen (veränderbaren) Referenzen.

Bei der Bearbeitung eines eindimensionalen Arrays kann "der Inhalt des Referenzziels mit einer Ganzzahl nicht geändert werden" (unveränderlich). Wenn Sie also eine andere Adresse angeben, wird der Wert erheblich geändert.

Wenn Sie ein zweidimensionales Array bearbeiten, können Sie den Wert ändern, während die Adresse unverändert bleibt, da "der Inhalt des Referenzziels mit dem Array geändert werden kann".

Apropos

Was ist mit dieser Art der Substitution?

#Das Muster bis jetzt
b = [[0] * 2] * 2
b[0][1] = 1
print(b) # [[0, 1], [0, 1]]
print(id(b[0]) == id(b[1])) #True

#Geänderte Version
b = [[0] * 2] * 2
b[0] = [0, 1]
print(b) # [[0, 1], [0, 0]]
print(id(b[0]) == id(b[1])) #False

Eine neue Adresse wird generiert. In diesem Fall wird es als "Neudefinition" anstelle von "Inhaltsoperation" behandelt und das Referenzziel wird geändert.

b = [[0] * 2] * 2
b[0] = [0, 0]
print(b) # [[0, 0], [0, 0]]
print(id(b[0]) == id(b[1])) #False

Referenz etc.

Referenz: http://delta114514.hatenablog.jp/entry/2018/01/02/233002

Nachtrag: Der Inhalt wurde auf der Grundlage der Kommentare überarbeitet. Ich habe das Konzept von "Python wird nur als Referenz übergeben" und "unveränderlich (unveränderlich) und veränderlich (veränderbar)" nicht verstanden. Referenz: https://snowtree-injune.com/2019/09/16/shallow-copy/

Recommended Posts

Zweidimensionale Python-Array-Falle [Kopie des Arrays]
Python: 3D-Array-Bild (numpy.array)
Mehrdimensionales Python-Array
Python> Link> Initialisierung und Zuweisung von 2D-Arrays
[Anfänger] Python-Array
Grundlagen des Python-Arrays
Berechnen Sie 2D IDCT ~ Python
Kopie der Python-Einstellungen
[Python] Binary Acing 2020D
[Python] Array-Slice-Operation
Python-Memo (für mich): Array
Sortieren Sie schnell ein Array in Python 3
Leeres mehrdimensionales Array in Python
So verschieben Sie ein zweidimensionales Array nur mit Python [Hinweis]
Flache Python-Kopie und tiefe Kopie
Python> Umgang mit 2D-Arrays
Stolpern Geschichte mit Python-Array
Löse ABC175 D in Python
Erstellen Sie ein Python-Numpy-Array
[Python] Kopie einer mehrdimensionalen Liste
AtCoder ABC 182 Python (A ~ D)
Python oder und und Operatorfalle
Python # Über Referenz und Kopie
Indexierter Zugriff auf das Python-Numpy-Array
Dreidimensionale Skelettstrukturanalyse mit Python
Löse ABC166 A ~ D mit Python
[Python] Kopierskript zum Generieren eines Kopierprotokolls
Python-Anwendung: Numpy Teil 3: Double Array
[Python] So tauschen Sie Array-Werte aus
Vergleichen Sie Python- und JavaScript-Array-Schleifen
[Python scipy] Upscaling / Downscaling von 2D-Daten
Lösen mit Ruby, Perl, Java und Python AtCoder ABC 131 D Sortieren von Arrays