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