Что выведет этот код?


def foo(x, y=None):
    if y is None:
        y = []
    y.append(x)
    return y

print(foo(1))
print(foo(2, [3]))

Результат выполнения кода:
[1]
[3, 2]

Разбор кода и предсказание результата:

Функция foo(x, y=None) принимает два аргумента: x и y. y имеет значение по умолчанию None.

Внутри функции происходит следующее:

  1. Проверяется, является ли y равным None.
  2. Если y равно None, то y инициализируется как пустой список ([]). Это ключевой момент, который создает "ловушку". Важно понимать, что этот список создается только один раз, при определении функции, и используется при каждом вызове foo с дефолтным значением y=None.
  3. Затем x добавляется в список y.
  4. Функция возвращает список y.

Результат выполнения кода:

Первый вызов: print(foo(1))

  • y равно None, поэтому y инициализируется как [].
  • 1 добавляется в y.
  • y теперь равно [1].
  • Выводится [1].

Второй вызов: print(foo(2, [3]))

  • y равно [3] (т.к. было передано явное значение).
  • 2 добавляется в y.
  • y теперь равно [3, 2].
  • Выводится [3, 2].

Таким образом, результат выполнения кода будет:


[1]
[3, 2]
  

Важность вопроса на собеседовании:

Этот вопрос проверяет понимание изменяемых аргументов по умолчанию в Python. Неправильное использование аргументов по умолчанию, особенно изменяемых (списки, словари), может привести к неожиданному поведению программы. Интервьюер хочет убедиться, что кандидат осознает эту особенность языка и умеет ее избегать.

0