Есть ли способ Python для закрытия переменной цикла?

Я только что наткнулся на статью Эрика Липперта Закрытие переменной цикла, считающейся вредоносной через 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 с его общим упором на незамкнутый объект структур, но мне любопытно, есть ли очевидный питонический способ справиться с этим, или мы должны идти по JS-маршруту вызовов вложенных функций, чтобы создавать действительно новые вары?

>>> l = []
>>> for r in range(10):
...     l.append((lambda x: lambda: x)(r))
...
>>> for f in l:
...     f()
...
0
1
2
# etc

20
задан quodlibetor 20 January 2012 в 19:32
поделиться