Rhaaa les listes en python !

Parfois python laisse dubitatif :

In [1]: alist = [{"pouet": 0, "prout":1},]*12                                                                                                                                                                      

In [2]: alist                                                                                                                                                                                                      
Out[2]: 
[{'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1}]

In [3]: alist[4]["pouet"] = 12                                                                                                                                                                                     

In [4]: alist                                                                                                                                                                                                      
Out[4]: 
[{'pouet': 12, 'prout': 1},
 {'pouet': 12, 'prout': 1},
 {'pouet': 12, 'prout': 1},
 {'pouet': 12, 'prout': 1},
 {'pouet': 12, 'prout': 1},
 {'pouet': 12, 'prout': 1},
 {'pouet': 12, 'prout': 1},
 {'pouet': 12, 'prout': 1},
 {'pouet': 12, 'prout': 1},
 {'pouet': 12, 'prout': 1},
 {'pouet': 12, 'prout': 1},
 {'pouet': 12, 'prout': 1}]

Donc quand on crée une liste par multiplication, ([1]*12) l’objet n’est pas dupliqué, juste le pointeur vers l’objet.

Cette méthode résout le problème:

In [5]: alist = [{"pouet": 0, "prout":1} for _ in range(12)]                                                                                                                                                       

In [6]: alist                                                                                                                                                                                                      
Out[6]: 
[{'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1}]

In [7]:  alist[4]["pouet"] = 12                                                                                                                                                                                    

In [8]: alist                                                                                                                                                                                                      
Out[8]: 
[{'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 12, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1},
 {'pouet': 0, 'prout': 1}]

Voila c’est tout, mais ça m’a bouffé une heure.

Ce contenu a été publié dans programmation, avec comme mot(s)-clé(s) , , , , . Vous pouvez le mettre en favoris avec ce permalien.

2 réponses à Rhaaa les listes en python !

  1. T dit :

    Je pense que 99.9% des cas où je me suis dit “hein? pourquoi ça marche pas alors qu’il n’y a pas d’erreur de logique dans mon code” sont du à ce genre de problèmes.

    Cela dit, une fois que le cerveau s’est habitué à la logique de la chose, cela va un peu mieux.

    Un article qui vient de sortir qui donnent d’autres exemples du même genre:
    https://towardsdatascience.com/python-pitfalls-expecting-the-unexpected-2e595dd1306c

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *