Статья подготовлена для студентов курса «Web-разработчик на Python» в образовательном проекте OTUS.
Снова сходив на несколько собеседований и пройдя тестовые задания, я заметил, что интервьюерам нравятся задания наподобие следующего.
Вопрос: Что выведет этот код?
Вывод первых двух строк достаточно очевиден, однако результат выполнения третьей строки f(3) не показался мне таким однозначным. Давайте посмотрим, что происходит после инициализации функции f. Чтобы запустить этот код, я воспользуюсь IPython.
Пустой список, который мы видим из результата выполнения f.__defaults__ — это переменная l в коде функции.
Ничего особенного.
Однако! Теперь мы видим, что переменная l имеет значение [0, 1] в силу изменчивости объекта списка в Python и передачи аргументов функции в качестве ссылки.
Тоже ничего особенного. Просто передача объекта list в качестве переменной l.
А вот теперь самое интересное. Когда вы запускаете f(3), Python не использует пустой список, который определен в коде функции, он использует переменную l со значениями из f.__defaults__ ([0, 1]).
P.S.
Если вам нужна функция, которая использует пустой список после каждого вызова, вам следует использовать что-то вроде этого (установить значение ‘l’ в ‘None’).
Заключение
Вот я и разобрал одну из самых популярных тестовых задач на собеседовании. Этот пост призван показать, что вы не всегда можете полагаться на свою интуицию, впрочем, как и я на свою :-).
Надеемся данный перевод станет полезным для вас. Традиционно ждем комментарии и до встречи на курсе.