Как работает функция add_element в приведённом фрагменте

Весь фрагмент не запустится: третий вызов содержит позиционный аргумент после именованного и вызывает SyntaxError. После исправления проявится общий изменяемый список src по умолчанию.

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

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

Весь фрагмент не запустится: третий вызов содержит позиционный аргумент после именованного и вызывает SyntaxError. После исправления проявится общий изменяемый список src по умолчанию.

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

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

Условие

Определите, какое действие выполняет следующий код:


def add_element(new: list[str], src: list = []) -> list:
    if isinstance(new, list):
        src.extend(new)
    else:
        src.append(new)
    return src

if __name__ == "__main__":
    value1 = add_element("test")
    print(value1)
    value2 = add_element(["test2", "test3"])
    print(value2)
    value3 = add_element(new=["test4"], value2)
    print(value3)

Ответ

Весь фрагмент не запустится: третий вызов содержит позиционный аргумент после именованного и вызывает SyntaxError. После исправления проявится общий изменяемый список src по умолчанию.

Исправьте вызов на add_element(new=['test4'], src=value2). Тогда первые две печати дадут ['test'] и ['test', 'test2', 'test3'], а третья добавит 'test4' в тот же список. value1 и value2 будут ссылаться на него же.

Чтобы независимые вызовы не делили список, задайте src=None и создавайте [] внутри функции только при src is None. Переданный явно список можно по контракту менять. Аннотация new: list[str] противоречит вызову со строкой; укажите str | list[str], если поддерживаются оба варианта.

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

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

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

Подробнее