Проанализируйте данный фрагмент на Python: def func(a=[]): a.append(1); return a; объясните, почему последовательные вызовы func() возвращают растущий список и как это поведение изменить при сохранении семантики по умолчанию

12 Мая в 07:55
47 +1
0
Ответы
1
Причина. В Python значение параметра по умолчанию вычисляется один раз — в момент определения функции. Если это изменяемый объект (например, список [][][]), то все вызовы без явного аргумента будут использовать один и тот же объект; метод `append` мутирует этот объект, поэтому последовательные вызовы растут: первые результаты будут [1][1][1], затем [1,1][1,1][1,1], [1,1,1][1,1,1][1,1,1] и т.д.
Как исправить (сохранить семантику «по умолчанию — пустой список»): использовать «сентинел» ‘None‘`None`None и внутри функции при необходимости создавать новый список:
def func(a=None):
if a is None:
a = []
a.append(1)
return a
Теперь подряд вызовы `func()` вернут [1][1][1], [1][1][1] и т.д. (каждый раз новый список). Обратите внимание: число, которое вы добавляете, это 111 в примере.
12 Мая в 07:59
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир