Меня немного удивил этот пример, приведенный Эли Бендерски (http://eli.thegreenplace.net/2015/the-scope-of-index-variables-in-pythons-for-loops/)
>>> def foo():
... lst = []
... for i in range(4):
... lst.append(lambda: i)
... print([f() for f in lst])
...
>>> foo()
[3, 3, 3, 3]
Но когда я подумал об этом, это имело некоторый смысл — лямбда фиксирует ссылку на i, а не значение i.
Таким образом, способ обойти это следующий:
>>> def foo():
... lst = []
... for i in range(4):
... lst.append((lambda a: lambda: a)(i))
... print([f() for f in lst])
...
>>> foo()
[0, 1, 2, 3]
Похоже, причина того, что это работает, заключается в том, что когда i предоставляется внешней лямбде, внешняя лямбда создает область видимости и разыменовывает i, устанавливая a в i. Затем возвращаемая внутренняя лямбда содержит ссылку на a.
Это правильное объяснение?