89 votes

Liaison des lambdas Python aux valeurs locales

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X