Анализ работы функции add_element в Python

В точности приведённый код не запустится: add_element(new=['test4'], value2) содержит позиционный аргумент после именованного и вызывает SyntaxError. Поэтому ни один print не выполнится.

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

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

В точности приведённый код не запустится: add_element(new=['test4'], value2) содержит позиционный аргумент после именованного и вызывает SyntaxError. Поэтому ни один print не выполнится.

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

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

Условие

Разберите, что делает представленный ниже фрагмент кода, учитывая различные варианты вызова функции и особенности использования mutable‑default аргументов.


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)

Опишите, какие результаты будут выведены и почему.

Ответ

В точности приведённый код не запустится: add_element(new=['test4'], value2) содержит позиционный аргумент после именованного и вызывает SyntaxError. Поэтому ни один print не выполнится.

Если исправить третий вызов на add_element(new=['test4'], src=value2), вывод станет:

['test']
['test', 'test2', 'test3']
['test', 'test2', 'test3', 'test4']

Первые два вызова разделяют один список src, созданный при определении функции. Третий явно передаёт тот же список. Все value1, value2 и value3 в конце ссылаются на него, хотя прежний вывод print не меняется. Аннотация new: list[str] не запрещает строку во время исполнения. Для независимого default используйте src=None и создание списка внутри условия.

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

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

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

Подробнее