leonhard | sdgkl a écrit :
Bonjour, j'ai fais un programme sur python dans lequel j'ai deux listes (L1 et L2) qui sont identiques au début du programme, mais je me sers de ces deux liste dans une boucle for dans laquelle j'ai besoin de les différencier (puisque je veux ajouter des éléments à l'une et d'autres éléments à l'autre) et à la fin de la boucle je dis a python que ces listes sont de nouveau les mêmes pour qu'il puisse recommencer la boucle avec 2 mêmes listes. Le problème c'est que python confond les deux listes, du coup quand je veux modifier L2 il modifie en fait L1...
j'ai essayé d'ecrire L2=L1[:] ou L2=list(L1] mais ça ne marche pas.. merci pour votre aide
|
Je ne comprends pas vraiment ce que tu veux. J'ai bricolé un petit exemple avec python 3.4
Code :
- >>> a = [1,2,3];
- >>> b = a[:]
- >>> a
- [1, 2, 3]
- >>> b
- [1, 2, 3]
- >>> a.append(4)
- >>> b.append(5)
- >>> a
- [1, 2, 3, 4]
- >>> b
- [1, 2, 3, 5]
|
donc le slicing produit bien une copie pour une liste plate.
Code :
- >>> l1=[1,2,[3,4,[5,6], 7], 8]
- >>> l1
- [1, 2, [3, 4, [5, 6], 7], 8]
- >>> l2 = l1[:]
- >>> l2
- [1, 2, [3, 4, [5, 6], 7], 8]
- >>> l2.append(9)
- >>> l2
- [1, 2, [3, 4, [5, 6], 7], 8, 9]
- >>> l1
- [1, 2, [3, 4, [5, 6], 7], 8]
- >>> l1[2][2]
- [5, 6]
- >> l2[2][2].append(0)
- >>> l2
- [1, 2, [3, 4, [5, 6, 0], 7], 8, 9]
- >>> l1
- [1, 2, [3, 4, [5, 6, 0], 7], 8]
|
donc ça ne marche pas pour les listes imbriquées! Pour faire une copie en profondeur, tu peux utiliser la fonction deepcopy:
Code :
- >>> import copy
- >>> l4 = copy.deepcopy(l3)
- >>> l3
- [1, 2, [3, 4, [5, 6], 7], 8]
- >>> l4
- [1, 2, [3, 4, [5, 6], 7], 8]
- >>> l4[2][2].append(11)
- >>> l4
- [1, 2, [3, 4, [5, 6, 11], 7], 8]
- >>> l3
- [1, 2, [3, 4, [5, 6], 7], 8]
|
Mais tout cela ne résoud que la première partie de ta question. La deuxième partie je ne l'ai pas (encore) comprise.
Bonne fête de Noël !
|