Piège de tableau bidimensionnel Python [copie du tableau]

C'est une chose basique, mais je suis coincé parce que je ne comprends pas, alors prenez note.

Préface

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? ?? ?? ?? ?? ??

Conclusion

É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]]

Pourquoi pas?

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.

Pourquoi cela ne se produit-il pas avec un tableau unidimensionnel?

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é».

Au fait

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 etc.

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

Piège de tableau bidimensionnel Python [copie du tableau]
Python: image de tableau 3D (numpy.array)
Tableau multidimensionnel Python
Python> lien> Initialisation et affectation de tableaux 2D
[Débutant] Tableau Python
principes de base des tableaux python
Calculer IDCT 2D ~ Python
Copie des préférences python
[Python] Acing binaire 2020D
[python] Opération de tranche de tableau
Mémo Python (pour moi): Array
Tri rapide d'un tableau en Python 3
Tableau multidimensionnel vide en python
Comment transloquer un tableau à deux dimensions en utilisant uniquement python [Note]
Copie superficielle Python et copie profonde
python> Gestion des tableaux 2D
Histoire de trébucher avec le tableau Python
Résoudre ABC175 D en Python
Créer un tableau numpy python
[Python] Copie d'une liste multidimensionnelle
AtCoder ABC 182 Python (A ~ D)
Python ou et et opérateur trap
Python # À propos de la référence et de la copie
Accès en indice au tableau numpy python
Analyse de la structure du squelette en trois dimensions avec Python
Résoudre ABC166 A ~ D avec Python
[python] Script de copie pour générer un journal de copie
Application Python: Numpy Partie 3: Double tableau
[Python] Comment permuter les valeurs de tableau
Comparez les boucles de tableau Python et JavaScript
[Python scipy] Augmentation / réduction de l'échelle des données 2D
Résolution avec Ruby, Perl, Java et Python AtCoder ABC 131 D Tri des tableaux