Замыкания — невероятно полезная функция языка. Они позволяют нам делать умные вещи, которые в противном случае потребовали бы большого количества кода, и часто позволяют нам писать более элегантный и понятный код. В Python 2.x имена переменных замыкания не могут быть переназначены; то есть функция, определенная внутри другой лексической области видимости, не может делать что-то вроде some_var = 'changed!'
для переменных за пределами своей локальной области видимости. Может кто-нибудь объяснить, почему это так? Были ситуации, когда я хотел бы создать замыкание, которое перепривязывает переменные во внешней области, но это было невозможно. Я понимаю, что почти во всех случаях (если не во всех) такого поведения можно добиться с помощью классов, но зачастую оно не такое чистое или элегантное. Почему я не могу сделать это с замыканием?
Вот пример повторного закрытия:
def counter():
count = 0
def c():
count += 1
return count
return c
Это текущее поведение, когда вы его вызываете:
>>> c()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in c
UnboundLocalError: local variable 'count' referenced before assignment
Вместо этого я хотел бы сделать следующее:
>>> c()
1
>>> c()
2
>>> c()
3
itertools.count(1).next
. По моему опыту, нелегко найти реальные случаи, когда идиоматический Python не такой чистый или элегантный, как Perl/JS/Scheme, использующий замыкания. - person Jason Orendorff   schedule 06.01.2010