В add_user список по умолчанию сохраняется между вызовами, а lambda поздно читает общую i. При буквальном требовании без второго аргумента вернуть самого пользователя нужен отдельный признак отсутствия аргумента.
Python - определить проблему в коде и переписать без ошибок
В add_user список по умолчанию сохраняется между вызовами, а lambda поздно читает общую i. При буквальном требовании без второго аргумента вернуть самого пользователя нужен отдельный признак отсутствия аргумента.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Python - определить проблему в коде и переписать без ошибок
Добавить пользователя в список и вернуть этот список.
Если при вызове не указан второй аргумент, в ответе вернуть пользователя.
def add_user(user, users=[]): users.append(user) return users
print(add_user("User"))
Создать список из трёх функций, где каждая функция при вызове возвращает своё число.
Первая функция должна вернуть - 0, вторая - 1, третья -2:
funcs = [lambda: i for i in range(3)] print([f() for f in funcs])
Ответ
В add_user список по умолчанию сохраняется между вызовами, а lambda поздно читает общую i. При буквальном требовании без второго аргумента вернуть самого пользователя нужен отдельный признак отсутствия аргумента.
_MISSING = object()
def add_user(user, users=_MISSING):
if users is _MISSING:
return user
users.append(user)
return users
funcs = [lambda i=i: i for i in range(3)]
print([f() for f in funcs]) # [0, 1, 2]
Так add_user('User') возвращает строку, а вызов с переданным списком изменяет этот список. Если подразумевался всегда список, а не сам пользователь, контракт нужно уточнить: тогда создавайте новый пустой список внутри функции при отсутствии аргумента. Захват i=i сохраняет текущее число для каждой функции.