Czytaj / zapisuj zamknięcia Pythona

Zamknięcia są niezwykle użyteczną funkcją języka. Pozwalają nam robić sprytne rzeczy, które w innym przypadku wymagałyby dużo kodu, a często umożliwiają nam pisanie kodu, który jest bardziej elegancki i przejrzysty. W Pythonie 2.x nazwy zmiennych zamknięć nie mogą być odbijane; to znaczy funkcja zdefiniowana w innym zakresie leksykalnym nie może zrobić czegoś takiegosome_var = 'changed!' dla zmiennych poza zasięgiem lokalnym. Czy ktoś może wyjaśnić, dlaczego tak jest? Zdarzały się sytuacje, w których chciałbym stworzyć zamknięcie, które powiąże zmienne w zewnętrznym zakresie, ale nie było to możliwe. Zdaję sobie sprawę, że prawie we wszystkich przypadkach (jeśli nie wszystkie) zachowanie to można osiągnąć za pomocą klas, ale często nie jest tak czyste lub eleganckie. Dlaczego nie mogę tego zrobić z zamknięciem?

Oto przykład zamknięcia wiązań:

def counter():
    count = 0
    def c():
        count += 1
        return count
    return c

To jest aktualne zachowanie, gdy to nazywasz:

>>> 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

Zamiast tego chciałbym to zrobić:

>>> c()
1
>>> c()
2
>>> c()
3

questionAnswers(7)

yourAnswerToTheQuestion