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

Код задачи:

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

repost

59

input message

напишите коммент

еще контент в этом сообществе

еще контент в этом соообществе

войдите, чтобы увидеть

и подписаться на интересных профи

в приложении больше возможностей

пока в веб-версии есть не всё — мы вовсю работаем над ней

сетка — cоциальная сеть для нетворкинга от hh.ru

пересекайтесь с теми, кто повлияет на ваш профессиональный путь