Oui c'est un truc piégeux de python que la façon dont le contexte est capturé ; on pense que chaque for va créer un nouveaux contexte, mais non, et du coup tes lambda utilisent la dernière valeur pour cat.
Il y a plusieurs façon de s'en sortir. Tu peux instancier ton instance de Button dans une fonction (chaque appel de fonction a bien son propre contexte—que va capturer ta lambda). Sinon il y a une astuce:
# Piège python classique
Posté par GuieA_7 (site web personnel) . En réponse au message instanciation objet tk.button et appels de fonctions. Évalué à 3.
Oui c'est un truc piégeux de python que la façon dont le contexte est capturé ; on pense que chaque
forva créer un nouveaux contexte, mais non, et du coup teslambdautilisent la dernière valeur pourcat.Il y a plusieurs façon de s'en sortir. Tu peux instancier ton instance de
Buttondans une fonction (chaque appel de fonction a bien son propre contexte—que va capturer talambda). Sinon il y a une astuce:Ça c'est ce que tu fais :
et qui va afficher :
2
2
2
Mais si tu écris "functions.append(lambda x=i: print(x))" (note le paramètre nommé "x"—il pourrait s'appeler "i" aussi) alors ça écrira bien:
0
1
2