bonjour
si je fais
alors B n'est pas affectéeCode:A=[1,2];B=A[:];del(A[0])
là je comprend
mais si je fais
alors B est affectée et là, je ne comprend plus..Code:
1
2
3
4 A=[[1,2],[3,4]] B=A[:] for ligne in A: del(ligne[0])
Version imprimable
bonjour
si je fais
alors B n'est pas affectéeCode:A=[1,2];B=A[:];del(A[0])
là je comprend
mais si je fais
alors B est affectée et là, je ne comprend plus..Code:
1
2
3
4 A=[[1,2],[3,4]] B=A[:] for ligne in A: del(ligne[0])
Bonjour,
C'est normal, parce que B=A[:] est une astuce qui ne fait que recopier les adresses des éléments de 1er niveau, mais laisse en commun les niveaux plus profonds.
Il existe d'autres solutions plus solides pour recopier complètement une liste de listes (=une arborescence de profondeur quelconque). Par exemple: deepcopy() du module copy:
Ce qui affiche:Code:
1
2
3
4
5
6 A=[[1,2],[3,4]] B=copy.deepcopy(A) for ligne in A: del(ligne[0]) print("A:", A) print("B:", B)
On peut aussi fabriquer une fonction récursive qui fait à peu près la même chose que deepcopy:Citation:
A: [[2], [4]]
B: [[1, 2], [3, 4]]
Son application donne, bien sûr, le même résultat sur les même données précédentes.Code:
1
2
3
4
5
6
7
8
9
10
11
12 def copieprofonde(L): """Retourne une copie complète de L, et convertit les tuples en listes """ R = [] for elem in L: if isinstance(elem, list): R.append(copieprofonde(elem)) elif isinstance(elem, tuple): R.append(copieprofonde(list(elem))) else: R.append(elem) return R
merci bien !