C'est une chose basique, mais je suis coincé parce que je ne comprends pas, alors prenez note.
Créer un tableau avec python est simple et agréable.
a = [0] * 2
print(a) # [0, 0]
Faisons également un tableau à deux dimensions.
b = [[0] * 2] * 2
print(b) # [[0, 0], [0, 0]]
Oh pratique. Exploitons-le.
b[0][1] = 1
Imprimons-le.
print(b) #[[0, 1], [0, 1]]
Hmm? ?? ?? ?? ?? ??
Écrivons ceci.
c = [[0] * 2 for i in range(2)]
print(c) # [[0, 0], [0, 0]]
c[0][1] = 1
print(c) # [[0, 1], [0, 0]]
Utilisons la fonction id ().
b = [[0] * 2] * 2
print(id(b[0])) # 1835216839944
print(id(b[1])) #1835216839944 Même adresse
c = [[0] * 2 for i in range(2)]
print(id(c[0])) # 1835216058120
print(id(c[1])) #1835216840392 Adresse différente
Si vous copiez avec * 2, vous vous référerez à la même adresse.
Si vous modifiez le "contenu" auquel l'adresse fait référence sous la forme b [0] [1] = 1, il sera reflété dans tous les tableaux qui partagent l'adresse.
Ce phénomène ne se produit pas avec un tableau unidimensionnel, non?
a = [0] * 2
a[0] = 1
print(a) # [1, 0]
Regardons l'adresse.
a = [0] * 2
print(a[0] == a[1]) # True
a[0] = 1
print(a[0] == a[1]) # False
print(a) # [1, 0]
Il avait la même adresse lors de sa première copie, mais lorsqu'un [0] = 1 a été attribué, l'adresse a changé.
C'est la différence entre les références immuables (immuables) et mutables (modifiables).
Lors de la manipulation d'un tableau unidimensionnel, "le contenu de la destination de référence avec un entier ne peut pas être modifié" (immuable), donc en donnant une adresse différente, la valeur est sensiblement modifiée.
Lors de la manipulation d'un tableau à deux dimensions, vous pouvez modifier la valeur tout en gardant l'adresse fixe car «le contenu de la destination de référence qui contient le tableau peut être modifié».
Et ce genre de substitution?
#Le modèle jusqu'à maintenant
b = [[0] * 2] * 2
b[0][1] = 1
print(b) # [[0, 1], [0, 1]]
print(id(b[0]) == id(b[1])) #True
#Version modifiée
b = [[0] * 2] * 2
b[0] = [0, 1]
print(b) # [[0, 1], [0, 0]]
print(id(b[0]) == id(b[1])) #False
Une nouvelle adresse sera générée. Dans ce cas, il sera traité comme "redéfinition" au lieu de "opération de contenu", et la destination de référence sera modifiée.
b = [[0] * 2] * 2
b[0] = [0, 0]
print(b) # [[0, 0], [0, 0]]
print(id(b[0]) == id(b[1])) #False
Référence: http://delta114514.hatenablog.jp/entry/2018/01/02/233002
Post-scriptum: Le contenu a été révisé sur la base des commentaires signalés. Je n'ai pas compris le concept de "Python est tout passé par référence" et "immuable (immuable) et mutable (modifiable)". Référence: https://snowtree-injune.com/2019/09/16/shallow-copy/
Recommended Posts