В Python значения по умолчанию для аргументов функций вычисляются только один раз при определении функции, а не при каждом её вызове
Таким образом, при первом вызове
func(2), l становится [0, 1]. Затем, при вызове func(3, [1, 2, 3]), l не изменяется, так как в качестве аргумента передается новый списокНаконец, при вызове
func(3), изменяется исходный список l, который теперь равен [0, 1, 0, 1, 4]