66 votes

Quelle est la difference entre list et list [:] en python?

Quelle est, le cas échéant, la différence entre list et list[:] python?

91voto

Ignacio Vazquez-Abrams Points 312628

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.

31voto

Matthew Mitchell Points 666

Ce dernier est une référence à une copie de la liste et non une référence à la liste. Donc c'est très utile.

 >>> li = [1,2,3]
>>> li2 = li
>>> li3 = li[:]
>>> li2[0] = 0
>>> li
[0, 2, 3]
>>> li3
[1, 2, 3]
 

4voto

tarashish Points 1062

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.

3voto

Abhranil Das Points 1993

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.

3voto

Glycerine Points 3526

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X