Es ist eine grundlegende Sache, aber ich stecke fest, weil ich es nicht verstehe, also mach dir eine Notiz.
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? ?? ?? ?? ?? ??
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]]
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.
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".
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: 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