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}]
Langage du code : JavaScript (javascript)
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}]
Langage du code : JavaScript (javascript)
Voila c’est tout, mais ça m’a bouffé une heure.
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
Merci T,
Bon maintenant j’ai compris je ne referais plus cette faute 😉