Я только что наткнулся на Эрика Липперта, закрывающего переменную цикла, считавшегося вредным через SO, и после экспериментов понял, что такая же проблема существует (и еще труднее обойти) в Python.*
>>> 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-пути вызовов вложенных функций, чтобы создать действительно новые переменные?
>>> l = []
>>> for r in range(10):
... l.append((lambda x: lambda: x)(r))
...
>>> for f in l:
... f()
...
0
1
2
# etc