2 listes identiques mais à différencier

2 listes identiques mais à différencier - Python - Programmation

Marsh Posté le 24-12-2014 à 18:52:20    

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  

Reply

Marsh Posté le 24-12-2014 à 18:52:20   

Reply

Marsh Posté le 25-12-2014 à 10:06:25    

J'ai plus ou moins le même problème :(

Code :
  1. print(terrain)
  2. self.map = list(terrain)
  3. for ligne in self.map:
  4.       for i in range(0, len(ligne)):
  5.            ligne[i] = '.'
  6. print(terrain)


A la fin la liste terrain est modifiée alors que je modifie juste self.map et que les deux listes n'ont pas la même référence. A mon avis la réponse à ton problème sera la réponse à mon problème.


Message édité par dced le 25-12-2014 à 10:20:52
Reply

Marsh Posté le 25-12-2014 à 16:32:04    

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 :
  1. >>> a = [1,2,3];
  2. >>> b = a[:]
  3. >>> a
  4. [1, 2, 3]
  5. >>> b
  6. [1, 2, 3]
  7. >>> a.append(4)
  8. >>> b.append(5)
  9. >>> a
  10. [1, 2, 3, 4]
  11. >>> b
  12. [1, 2, 3, 5]


 
donc le slicing produit bien une copie pour une liste plate.  
 

Code :
  1. >>> l1=[1,2,[3,4,[5,6], 7], 8]
  2. >>> l1
  3. [1, 2, [3, 4, [5, 6], 7], 8]
  4. >>> l2 = l1[:]
  5. >>> l2
  6. [1, 2, [3, 4, [5, 6], 7], 8]
  7. >>> l2.append(9)
  8. >>> l2
  9. [1, 2, [3, 4, [5, 6], 7], 8, 9]
  10. >>> l1
  11. [1, 2, [3, 4, [5, 6], 7], 8]
  12. >>> l1[2][2]
  13. [5, 6]
  14. >> l2[2][2].append(0)
  15. >>> l2
  16. [1, 2, [3, 4, [5, 6, 0], 7], 8, 9]
  17. >>> l1
  18. [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 :
  1. >>> import copy
  2. >>> l4 = copy.deepcopy(l3)
  3. >>> l3
  4. [1, 2, [3, 4, [5, 6], 7], 8]
  5. >>> l4
  6. [1, 2, [3, 4, [5, 6], 7], 8]
  7. >>> l4[2][2].append(11)
  8. >>> l4
  9. [1, 2, [3, 4, [5, 6, 11], 7], 8]
  10. >>> l3
  11. [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 !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed