Mediumgotcha

Как работают дефолтные mutable аргументы?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

Default значение вычисляется ОДИН РАЗ при определении функции, не при каждом вызове. Для mutable (list, dict, set) это баг: один и тот же объект переиспользуется.

# ПЛОХО: один list на все вызовы
def append_to(x, lst=[]):
    lst.append(x)
    return lst

append_to(1)   # [1]
append_to(2)   # [1, 2] — тот же list!

# ХОРОШО: новый list каждый раз
def append_to(x, lst=None):
    if lst is None:
        lst = []
    lst.append(x)
    return lst
  • Default для immutable (int, str) — безопасно;
  • Mutable default иногда полезно намеренно — для memoization: def fib(n, cache={}): ...;
  • Ловушка часто встречается в интервью — знать обязательно.

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.