Вывод будет [10], затем [123], затем [10, 'a']. Первый и третий вызовы используют общий список по умолчанию, а второй получает отдельный явно созданный пустой список.
Особенности поведения аргументов по умолчанию в Python
Вывод будет [10], затем [123], затем [10, 'a']. Первый и третий вызовы используют общий список по умолчанию, а второй получает отдельный явно созданный пустой список.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Каким будет вывод программы, если выполнить следующий код?
def extend_list(val, lst=[]):
lst.append(val)
return lst
print(extend_list(10))
print(extend_list(123, []))
print(extend_list('a'))
Ответ
Вывод будет [10], затем [123], затем [10, 'a']. Первый и третий вызовы используют общий список по умолчанию, а второй получает отдельный явно созданный пустой список.
Точный результат:
[10]
[123]
[10, 'a']
default=[] вычисляется один раз при определении extend_list. Передача [] во втором вызове не заменяет этот default: это другой объект только для данного вызова. Чтобы каждый вызов без списка начинал с пустого контейнера, используйте lst=None и внутри if lst is None: lst = []. Явно переданные списки тогда можно продолжать изменять по договорённости.