На Python следующая функция: "def f(nums=[]): nums.append(1); return nums" — почему вызов f() два раза вернёт [1] и потом [1,1]? Как правильно написать функцию с неизменяемыми дефолтными аргументами?

24 Ноя в 12:16
1 +1
0
Ответы
1
Потому что значение дефолтного аргумента вычисляется один раз при определении функции и затем переиспользуется. В вашем примере один и тот же список (дефолт [] [] []) модифицируется методом `append`, поэтому первый вызов даёт [1] [1] [1], второй — уже [1,1] [1,1] [1,1].
Правильный вариант — не использовать изменяемый объект как дефолт, а создавать новый внутри функции, например через `None`:
def f(nums=None):
if nums is None:
nums = []
nums.append(1)
return nums
Альтернативы: использовать дефолтный кортеж и конвертировать, или специальный sentinel, но паттерн с `None` самый распространённый и простой.
24 Ноя в 12:23
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир