В приведённом фрагменте Python объясните поведение и предложите исправление: def add(x, lst=[]): lst.append(x) return lst; Что произойдёт при последовательных вызовах add(1), add(2) и почему
Поведение: по умолчанию список в заголовке lst=[]lst=[]lst=[] создаётся один раз при определении функции и затем переиспользуется. При изменении этого объекта (например, вызовом lst.appendlst.appendlst.append) изменения сохраняются между вызовами. Последовательные вызовы: - add(1)add(1)add(1) вернёт [1][1][1]. - затем add(2)add(2)add(2) вернёт [1,2][1,2][1,2] — потому что оба вызова работают с одним и тем же списком. Исправление (без использования мутируемого значения по умолчанию): def add(x, lst=None): if lst is None: lst = [] lst.append(x) return lst Теперь add(1)add(1)add(1) даст [1][1][1], а отдельный вызов add(2)add(2)add(2) (без передачи второго аргумента) даст [2][2][2].
Последовательные вызовы:
- add(1)add(1)add(1) вернёт [1][1][1].
- затем add(2)add(2)add(2) вернёт [1,2][1,2][1,2] — потому что оба вызова работают с одним и тем же списком.
Исправление (без использования мутируемого значения по умолчанию):
def add(x, lst=None):
if lst is None:
lst = []
lst.append(x)
return lst
Теперь add(1)add(1)add(1) даст [1][1][1], а отдельный вызов add(2)add(2)add(2) (без передачи второго аргумента) даст [2][2][2].