Ho appena incontrato il numero Closing over the loop variable considered harmful di Eric Lippert tramite SO e, dopo aver sperimentato, mi sono reso conto che lo stesso problema esiste (ed è ancora più difficile da aggirare) in Python.Esiste un modo Pythonic per chiudere su una variabile di loop?
>>> l = []
>>> for r in range(10):
... def foo():
... return r
... l.append(foo)
...
>>> for f in l:
... f()
...
9
9
9
# etc
e, il C# soluzione standard non funziona (presumo a causa della natura dei riferimenti in Python)
>>> l = []
>>> for r in range(10):
... r2 = r
... def foo():
... return r2
... l.append(foo)
...
>>> for f in l:
... f()
...
9
9
9
# etc
riconosco che questo non è un gran problema in Python con la sua enfasi generale sulle strutture di oggetti non a chiusura, ma sono curioso di sapere se esiste un ovvio modo Pythoniano per gestirle, o dobbiamo seguire la rotta JS delle chiamate di funzioni annidate per creare varsene realmente nuove?
>>> l = []
>>> for r in range(10):
... l.append((lambda x: lambda: x)(r))
...
>>> for f in l:
... f()
...
0
1
2
# etc
Oh, mi piace il trucco di argomento predefinito. Quella fabbrica di funzioni è semanticamente simile alla doppia cosa lambda alla fine della mia. Le fabbriche Lambda sono la rovina della leggibilità, però. – quodlibetor