ArtemBalandin81 / tech_accidents

Приложение для учета и фиксации простоев в бизнес-процессах УК ПИФ, АИФ, НПФ
MIT License
0 stars 0 forks source link

убрать изменяемые объекты как умолчательные параметры функций #74

Open ArtemBalandin81 opened 5 months ago

ArtemBalandin81 commented 5 months ago

Why?

не рекомендуется в качестве значения по умолчанию ставить изменяемый объект в питон: если вы используете изменяемый объект (например, список) в качестве значения по умолчанию, то любые изменения, внесенные в этот объект в одном месте, будут видны во всех других местах, где используется это значение по умолчанию.

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

How To Do?

ArtemBalandin81 commented 5 months ago

Рассмотрим следующий пример: def my_function(x=[]): x.append("Hello") return x

a = my_function() b = my_function() print(a) # Output: ['Hello'] print(b) # Output: ['Hello', 'Hello'] В этом примере функция my_function принимает аргумент x со значением по умолчанию [], которое является пустым списком. Однако, поскольку список является изменяемым объектом, когда мы вызываем функцию без аргумента, создается новый список, который затем изменяется. Когда мы вызываем функцию второй раз, создается новый список, но поскольку значение по умолчанию уже было создано при определении функции, этот новый список ссылается на тот же объект, что и первый список. Поэтому, когда мы добавляем элемент в список в первом вызове функции, он также добавляется во второй список, поскольку они оба ссылаются на один и тот же объект.