Затварянията са невероятно полезна функция на езика. Те ни позволяват да правим умни неща, които иначе биха отнели много код, и често ни позволяват да пишем код, който е по-елегантен и по-ясен. В 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