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