Le code suivant affiche 1
deux fois, mais je m'attends à voir 0
et ensuite 1
.
def pv(v) :
print v
x = []
for v in range(2):
x.append(lambda : pv(v))
for xx in x:
xx()
Je m'attendais à ce que les lambdas python se lient à la référence vers laquelle pointe une variable locale, en coulisses. Or, cela ne semble pas être le cas. J'ai rencontré ce problème dans un grand système où le lambda fait l'équivalent moderne du C++ d'un bind ('boost::bind' par exemple) où dans un tel cas vous vous lieriez à un smart ptr ou une copie construisant une copie pour le lambda.
Alors, comment lier une variable locale à une fonction lambda et faire en sorte qu'elle conserve la bonne référence lorsqu'elle est utilisée ? Je suis assez stupéfait de ce comportement, car je ne m'attendais pas à ce que cela se produise dans un langage doté d'un ramasse-miettes.