Po prostu przebiegłem przez Eric'a Lippert'a Closing over the loop variable considered harmful przez SO, i po eksperymentach zdałem sobie sprawę, że ten sam problem istnieje (i jest jeszcze trudniejszy do obejścia) w Pythonie.Czy istnieje Pythoniczny sposób na zamknięcie zmiennej pętli?
>>> l = []
>>> for r in range(10):
... def foo():
... return r
... l.append(foo)
...
>>> for f in l:
... f()
...
9
9
9
# etc
, a średnia C# obejście nie działa (zakładam, ze względu na charakter odniesień w Pythonie)
>>> l = []
>>> for r in range(10):
... r2 = r
... def foo():
... return r2
... l.append(foo)
...
>>> for f in l:
... f()
...
9
9
9
# etc
uznaję, że to nie jest wielkim problemem w Pythonie z jego ogólny nacisk na niezamknięte struktury obiektów, ale jestem ciekawy, czy istnieje oczywisty sposób Pythonic do obsługi tego, czy też musimy iść na ścieżkę JS zagnieżdżonych wywołań funkcji, aby utworzyć faktycznie nowe vary?
>>> l = []
>>> for r in range(10):
... l.append((lambda x: lambda: x)(r))
...
>>> for f in l:
... f()
...
0
1
2
# etc
Och, podoba mi się ta domyślna sztuczka z argumentem. Ta fabryka funkcji jest semantycznie podobna do podwójnej rzeczy lambda na końcu mojej. Jednak fabryki Lambda są zmorą czytelności. – quodlibetor