Почему это закрытие не изменяет переменную в охватывающей области видимости?

Эта часть Python не работает:

def make_incrementer(start):
    def closure():
        # I know I could write 'x = start' and use x - that's not my point though (:
        while True:
            yield start
            start += 1
    return closure

x = make_incrementer(100)
iter = x()
print iter.next()    # Exception: UnboundLocalError: local variable 'start' referenced before assignment

Я знаю, как исправить эту ошибку, но потерпите:

Этот код работает нормально:

def test(start):
    def closure():
        return start
    return closure

x = test(999)
print x()    # prints 999

Почему я могу читать переменную start внутри закрытия, но не записывать в нее? Какое правило языка вызывает такую обработку переменной start?

Обновление: Я нашел этот пост SO релевантным (ответ больше, чем вопрос): Read/Write Python Closures

19
задан Community 23 May 2017 в 12:18
поделиться