При 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, а пользовательский тип должен иметь корректный контракт копирования.