Quelle est, le cas échéant, la différence entre list
et list[:]
python?
Réponses
Trop de publicités? Lors de la lecture, list
est une référence à la liste d'origine et list[:]
copie superficielle la liste.
Lors de l'affectation, list
(re) lie le nom et list[:]
slice-assigns, en remplaçant ce qui était auparavant dans la liste.
De même, n'utilisez pas list
comme nom car il occulterait les fonctions intégrées.
li [:] crée une copie de la liste d'origine. Mais il ne fait pas référence au même objet de liste. Par conséquent, vous ne risquez pas de changer la liste originale en changeant la copie créée par li [:].
par exemple:
>>> list1 = [1,2,3]
>>> list2 = list1
>>> list3 = list1[:]
>>> list1[0] = 4
>>> list2
[4, 2, 3]
>>> list3
[1, 2, 3]
Ici, list2
est changé en changeant list1
mais list3
ne change pas.
Toutefois, si les éléments de la liste sont des listes elles-mêmes, même list1 = list[:]
a ses problèmes. Considérer:
>>> a = [[1,2,3],[4,5,6],[7,8,9]]
>>> b = a[:]
>>> b[0].remove(2)
>>> b
[[1, 3], [4, 5, 6], [7, 8, 9]]
>>> a
[[1, 3], [4, 5, 6], [7, 8, 9]]
Cela se produit parce que chaque élément de la liste en cours de copie sur b est une liste elle-même, et cette copie de listes implique le même problème qui se produit avec la normale list1 = list2
.
Le plus court chemin que j'ai trouvé est explicitement copie de chaque élément de la liste de cette façon:
>>> a = [[1,2,3],[4,5,6],[7,8,9]]
>>> b=[[j for j in i] for i in a]
>>> b
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> b[0].remove(2)
>>> b
[[1, 3], [4, 5, 6], [7, 8, 9]]
>>> a
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Bien sûr, pour chaque degré supplémentaire de nidification dans la liste imbriquée, la copie du code approfondit par un supplément de inline for
boucle.
Appliquer le premier list
à une variable créera une référence à la liste d'origine. Le second list[i]
créera une copie superficielle.
par exemple:
foo = [1,2,3]
bar = foo
foo[0] = 4
bar et foo seront maintenant:
[4,2,3]
mais:
foo = [1,2,3]
bar = foo[:]
foo[0] = 4
le résultat sera:
bar == [1,2,3]
foo == [4,2,3]
:
est à trancher.