Comme il m'est difficile de comprendre le comportement de la copie d'une liste multidimensionnelle de Python, je l'ai organisée avec les résultats expérimentaux.
En conclusion, copy ()
, list [:]
et copy.copy ()
dans la bibliothèque de copie sont des copies superficielles, créant une nouvelle liste multidimensionnelle puis l'original. Insérez une référence à la liste trouvée dans la liste.
La bibliothèque de copie copy.deepcopy ()
est une copie profonde qui crée une nouvelle liste multidimensionnelle, puis insère une copie de la liste trouvée dans la liste d'origine.
copy()
Je ne sais pas si la "première couche" est meilleure ou la "première dimension" est meilleure ... L'ID est naturellement différent car la copie crée une autre liste multidimensionnelle. Cependant, comme le contenu de la liste est des références, la réécriture de la première couche de la copie n'affecte pas la liste d'origine, mais la réécriture de la deuxième couche et des couches suivantes se propage à l'original même si l'ID est différent.
copy()
lst = [[0]*3 for _ in range(3)]
lst1 = lst.copy()
lst1[1] = ['r'] * 3
print('lst1 = ', lst1)
print('id(lst1) = %d' % id(lst1))
print('lst = ', lst)
print('id(lst) = %d' % id(lst))
lst1[0][1] = 'r'
print('lst1 = ', lst1)
print('id(lst1) = %d' % id(lst1))
print('lst = ', lst)
print('id(lst) = %d' % id(lst))
production
lst1 = [[0, 0, 0], ['r', 'r', 'r'], [0, 0, 0]]
id(lst1) = 139730947400512
lst = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
id(lst) = 139730946890944
lst1 = [[0, 'r', 0], ['r', 'r', 'r'], [0, 0, 0]]
id(lst1) = 139730947400512
lst = [[0, 'r', 0], [0, 0, 0], [0, 0, 0]]
id(lst) = 139730946890944
Liste [:]
Identique à copy ()
.
python:liste[:]
lst = [[0]*3 for _ in range(3)]
lst1 = lst[:]
lst1[1] = ['r'] * 3
print('lst1 = ', lst1)
print('id(lst1) = %d' % id(lst1))
print('lst = ', lst)
print('id(lst) = %d' % id(lst))
lst1[0][1] = 'r'
print('lst1 = ', lst1)
print('id(lst1) = %d' % id(lst1))
print('lst = ', lst)
print('id(lst) = %d' % id(lst))
production
lst1 = [[0, 0, 0], ['r', 'r', 'r'], [0, 0, 0]]
id(lst1) = 140313735131456
lst = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
id(lst) = 140313734622336
lst1 = [[0, 'r', 0], ['r', 'r', 'r'], [0, 0, 0]]
id(lst1) = 140313735131456
lst = [[0, 'r', 0], [0, 0, 0], [0, 0, 0]]
id(lst) = 140313734622336
copy.copy ()
Identique à copy ()
.
copy.copy()
import copy
lst = [[0]*3 for _ in range(3)]
lst1 = copy.copy(lst)
lst1[1] = ['r'] * 3
print('lst1 = ', lst1)
print('id(lst1) = %d' % id(lst1))
print('lst = ', lst)
print('id(lst) = %d' % id(lst))
lst1[0][1] = 'r'
print('lst1 = ', lst1)
print('id(lst1) = %d' % id(lst1))
print('lst = ', lst)
print('id(lst) = %d' % id(lst))
production
lst1 = [[0, 0, 0], ['r', 'r', 'r'], [0, 0, 0]]
id(lst1) = 139783910001664
lst = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
id(lst) = 139783910057280
lst1 = [[0, 'r', 0], ['r', 'r', 'r'], [0, 0, 0]]
id(lst1) = 139783910001664
lst = [[0, 'r', 0], [0, 0, 0], [0, 0, 0]]
id(lst) = 139783910057280
copy.deepcopy ()
Étant donné que la copie crée une autre liste multidimensionnelle, l'ID sera différent et le contenu de cette liste sera également copié. Pour ainsi dire, un clone est fait. Le contenu est exactement le même, mais différent, donc la réécriture n'affectera pas l'original.
copy.deepcopy()
import copy
lst = [[0]*3 for _ in range(3)]
lst1 = copy.deepcopy(lst)
lst1[1] = ['r'] * 3
print('lst1 = ', lst1)
print('id(lst1) = %d' % id(lst1))
print('lst = ', lst)
print('id(lst) = %d' % id(lst))
lst1[0][1] = 'r'
print('lst1 = ', lst1)
print('id(lst1) = %d' % id(lst1))
print('lst = ', lst)
print('id(lst) = %d' % id(lst))
production
lst1 = [[0, 0, 0], ['r', 'r', 'r'], [0, 0, 0]]
id(lst1) = 139629482679488
lst = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
id(lst) = 139629482735040
lst1 = [[0, 'r', 0], ['r', 'r', 'r'], [0, 0, 0]]
id(lst1) = 139629482679488
lst = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
id(lst) = 139629482735040
Python - Liste en double copie --- opérations de copie superficielle et de copie profonde [Python] Comment empêcher la liste d'origine d'être modifiée en attribuant une liste à l'argument d'une fonction que vous avez créée
Recommended Posts