Я просто столкнулся с Closing over the loop variable considered harmful Эриком Липпертом через SO, и после экспериментов понял, что такая же проблема существует (и еще сложнее обойти) в Python.Есть ли у Pythonic способ закрыть переменную цикла?
>>> l = []
>>> for r in range(10):
... def foo():
... return r
... l.append(foo)
...
>>> for f in l:
... f()
...
9
9
9
# etc
и, стандарт C# обходной путь не работает (я предполагаю, что из-за характера ссылок на 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
Я признаю, что это не большая проблема в Python с его основное внимание уделяется структурам, не связанным с закрытием, но мне любопытно, есть ли очевидный Pythonic способ справиться с этим, или нам нужно идти по пути JS вызовов вложенных функций для создания фактически новых vars?
>>> l = []
>>> for r in range(10):
... l.append((lambda x: lambda: x)(r))
...
>>> for f in l:
... f()
...
0
1
2
# etc
О, мне нравится этот трюк по умолчанию. Эта фабрика функций семантически похожа на двойную лямбда-вещь в конце моей. Тем не менее, фабрики лямбда - это проницательность. – quodlibetor