Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
ArtemBalandin81 opened this issue May 18, 2024 · 1 comment

Comments

@ArtemBalandin81
Copy link
Owner

ArtemBalandin81 commented May 18, 2024

Why?

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

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

How To Do?

  • Чтобы избежать подобных проблем, рекомендуется использовать неизменяемые объекты (например, строки, числа, кортежи) в качестве значений по умолчанию или явно создавать новый объект при каждом вызове функции или создании экземпляра класса.
@ArtemBalandin81
Copy link
Owner Author

Рассмотрим следующий пример:
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 со значением по умолчанию [], которое является пустым списком. Однако, поскольку список является изменяемым объектом, когда мы вызываем функцию без аргумента, создается новый список, который затем изменяется. Когда мы вызываем функцию второй раз, создается новый список, но поскольку значение по умолчанию уже было создано при определении функции, этот новый список ссылается на тот же объект, что и первый список. Поэтому, когда мы добавляем элемент в список в первом вызове функции, он также добавляется во второй список, поскольку они оба ссылаются на один и тот же объект.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant