Создание отдельного экземпляра без использования изменяемого значения по умолчанию

При data=None исходная функция уже создаёт новый список на каждый вызов, поэтому последний assert неверен. Если передан список, его нужно копировать перед append, чтобы не менять оригинал.

Короткий ответ

Что ответить на собеседовании

При data=None исходная функция уже создаёт новый список на каждый вызов, поэтому последний assert неверен. Если передан список, его нужно копировать перед append, чтобы не менять оригинал.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо написать функцию, которая возвращает новый объект того же типа, что и аргумент, но с добавленным элементом. Функция должна корректно работать, когда аргумент не передан (значение по умолчанию — None), и каждый вызов должен создавать независимый объект.

def make_obj(data=None):
    if data is None:
        data = []
    data.append(1)
    return data

assert make_obj() == [1]
assert make_obj() == make_obj()
assert make_obj() == [1, 1, 1, 1]

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

Ответ

При data=None исходная функция уже создаёт новый список на каждый вызов, поэтому последний assert неверен. Если передан список, его нужно копировать перед append, чтобы не менять оригинал.

Вариант для объектов, поддерживающих копирование и append:

from copy import copy

def make_obj(data=None):
    result = [] if data is None else copy(data)
    result.append(1)
    return result

Каждый вызов make_obj() возвращает [1], а не накопленный список. Равенство результатов двух вызовов не означает идентичности объектов. Для обычного списка copy создаёт независимый внешний контейнер; вложенные значения остаются общими. Произвольный тип нельзя автоматически поддержать: у tuple или int нет append, а пользовательский тип должен иметь корректный контракт копирования.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее