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