Разберите поведение Python‑функции с дефолтным изменяемым аргументом: def append_item(val, lst=[]): lst.append(val); return lst Почему результат может быть неожиданным и как это исправить
Проблема: дефолтное значение выражения `lst=[]` создаётся один раз при определении функции и затем переиспользуется во всех последующих вызовах, поэтому один и тот же изменяемый список накапливает элементы. Пример поведения: - `append_item(1)` возвращает [1][1][1] - `append_item(2)` возвращает [1,2][1, 2][1,2] — неожиданно, потому что второй вызов добавил в список от первого - `append_item(3, [])` возвращает [3][3][3] — при явной передаче нового списка всё нормально Исправление (использовать None как «сентинел» и создавать новый список внутри функции): def append_item(val, lst=None): if lst is None: lst = [] lst.append(val) return lst Теперь: - `append_item(1)` возвращает [1][1][1] - `append_item(2)` возвращает [2][2][2] Альтернативы: использовать неизменяемый дефолт (например, кортеж) или явно копировать дефолтный объект внутри функции, но стандартный и рекомендуемый способ — `lst=None`.
Пример поведения:
- `append_item(1)` возвращает [1][1][1]
- `append_item(2)` возвращает [1,2][1, 2][1,2] — неожиданно, потому что второй вызов добавил в список от первого
- `append_item(3, [])` возвращает [3][3][3] — при явной передаче нового списка всё нормально
Исправление (использовать None как «сентинел» и создавать новый список внутри функции):
def append_item(val, lst=None):
if lst is None:
lst = []
lst.append(val)
return lst
Теперь:
- `append_item(1)` возвращает [1][1][1]
- `append_item(2)` возвращает [2][2][2]
Альтернативы: использовать неизменяемый дефолт (например, кортеж) или явно копировать дефолтный объект внутри функции, но стандартный и рекомендуемый способ — `lst=None`.