• # Piège python classique

    Posté par (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 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:

    Ça c'est ce que tu fais :

    functions = []
    for i in range(3):
     functions.append(lambda: print(i))
    for func in functions: 
     func()

    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