Вчерашняя задача вызвала не мало обсуждений и даже споров в нашем чате. Правильный ответ выбрали треть голосовавших. Давайте разберём, что в этой задаче не так.

Код задачи:

def outer(x):
    def inner():
        nonlocal x
        x += 1
        return x
    return inner

x = 10
increment = outer(x)
x = increment() + increment()
print(x)

Разбор задачи Создаём переменную x и присваиваем ей число 10. Назовём её x1 для ясности. Затем создаём переменную increment, в которую помещаем вызов функции outer(x).

Функция outer принимает позиционный аргумент x, его назовём x2. Внутри находится функция inner и возврат этой функции. Именно функция inner и попадает в переменную increment.

Ниже мы перезаписываем переменную x1, помещая в неё результат сложения возвратов из функции inner.

В функции inner, используя аргумент nonlocal, мы получаем доступ к переменной x2. Прибавляем к ней единицу и возвращаем её.

В самом конце, выводим значение переменной x1, используя функцию print().

Правильный ответ: 23.

Почему такой ответ? Самый популярный ответ в голосовании - 22 и на первый взгляд так оно и есть, но не всё так просто.

Создав переменную increment, мы передали в функцию outer - x1 равный 10, тем самым "замкнули" это значение.

Затем при первом вызове increment() в операции сложения, значение замкнутого x2 изменился с 10 на 11 и вернули его. При повторном вызове, значение x2 равно 11 и, добавив к нему единицу, становится - 12.

Таким образом 11 + 12 = 23.