Вчерашняя задача вызвала не мало обсуждений и даже споров в нашем чате. Правильный ответ выбрали треть голосовавших. Давайте разберём, что в этой задаче не так.
Код задачи:
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.