Почему значение, возвращаемое функцией, остается неизменным при последующих вызовах функции?

Как можно объяснить неожиданное поведение функции test при повторных вызовах с одним и тем же значением аргумента по умолчанию?
  • 18 декабря 2023 г. 14:17
Ответы на вопрос 3
Значение, возвращаемое функцией, остается неизменным при последующих вызовах функции, потому что при каждом вызове функции создается новое локальное пространство имен для этого вызова. Все переменные, определенные внутри функции, находятся в этом локальном пространстве имен, и они существуют только во время выполнения и использования функции.

При каждом вызове функции значение, возвращаемое функцией, вычисляется заново в этом локальном пространстве имен на основе входных аргументов и любых других переменных или данных, используемых внутри функции. Поэтому значение, возвращаемое функцией, может быть разным в зависимости от входных аргументов или внутреннего состояния функции.

Неожиданное поведение функции test при повторных вызовах с одним и тем же значением аргумента по умолчанию может быть объяснено, если функция использует какое-то внутреннее состояние или переменную, которая изменяется между вызовами функции. Например, если функция test изменяет значение некоторой глобальной переменной или другого объекта, то повторный вызов функции с одним и тем же значением аргумента по умолчанию может привести к разным результатам, потому что функция уже оперирует с измененным состоянием или переменной.
гугление "python default argument" выдаёт 
Python's default arguments are evaluated once when the function is defined, not each time the function is called
Потому что объект список мутабельный объект rez = []. Ты ожидаешь, что при каждом новом вызове функции у тебя создается пустой список res, а это не так почитай к чему ведет мутабельные типы в качестве значений по умолчанию у параметров функции. 

1. В первом случае ты вызываешь первый раз работает как ожидаешь, но но список res уже создан и существует.
2. В втором ты оставляешь без изменения свой дефолтный параметр (список), а он то уже заполнен, и он просто добавляет в него.
3. В третьем случе ты передаешь новый список (новый объект). По этому работает нормально.

Общий кейс для решения таких проблем как то так.
Похожие вопросы