En python les variables sont des références, même les integers.
A la fin de l'execution de ta comprehension de list, i vaut 4 et toutes les lambda retournent une référence vers i donc retournent 4.
C'est pas spécifique à python, Javascript fait la même chose quand tu fais des trucs de ce genre :
for (var i = 1; i <= 2; i++) {
setTimeout(function() { alert(i) }, 100);
}
Un workaround serait de "forcer" la copie de i en le faisant passer en paramètre, faire un truc de ce genre:
l = [(lambda i=i: i) for i in range(0, 5)]
[f() for f in l] # [0, 1, 2, 3, 4]
Plus d'infos ici : https://docs.python.org/3/faq/programming.html#why-do-lambdas-defined-in-a-loop-with-different-values-all-return-the-same-result
Message édité le 28 juin 2022 à 23:43:54 par [Black_Spirit]