На Python следующая функция: "def f(nums=[]): nums.append(1); return nums" — почему вызов f() два раза вернёт [1] и потом [1,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` самый распространённый и простой.
Правильный вариант — не использовать изменяемый объект как дефолт, а создавать новый внутри функции, например через `None`:
def f(nums=None):
if nums is None:
nums = []
nums.append(1)
return nums
Альтернативы: использовать дефолтный кортеж и конвертировать, или специальный sentinel, но паттерн с `None` самый распространённый и простой.