Проанализируйте данный фрагмент на Python: def func(a=[]): a.append(1); return a; объясните, почему последовательные вызовы func() возвращают растущий список и как это поведение изменить при сохранении семантики по умолчанию
Причина. В 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 в примере.
Как исправить (сохранить семантику «по умолчанию — пустой список»): использовать «сентинел» ‘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 в примере.