Когда значение по умолчанию для аргумента функции изменяется между вызовами, это может привести к неожиданному поведению, особенно если значение по умолчанию является изменяемым объектом (например, списком или словарем).
Причина этого заключается в том, что значения по умолчанию для аргументов функций в Python создаются только один раз, при определении функции, а не при каждом ее вызове. Таким образом, если значение по умолчанию является изменяемым объектом, то этот объект будет общим между всеми вызовами функции, если аргумент не будет явно передан.
Рассмотрим пример:
def my_function(my_list=[]):
my_list.append(1)
print(my_list)
my_function() # Вывод: [1]
my_function() # Вывод: [1, 1]
my_function() # Вывод: [1, 1, 1]
В этом примере, my_list
инициализируется пустым списком только один раз. Каждый последующий вызов my_function()
без аргументов добавляет 1
к одному и тому же списку, изменяя его значение между вызовами.
Чтобы избежать этой проблемы, рекомендуется использовать None
в качестве значения по умолчанию и создавать новый изменяемый объект внутри функции, если значение аргумента равно None
:
def my_function(my_list=None):
if my_list is None:
my_list = []
my_list.append(1)
print(my_list)
my_function() # Вывод: [1]
my_function() # Вывод: [1]
my_function() # Вывод: [1]
В этом исправленном варианте, каждый вызов my_function()
без аргументов создает новый пустой список, что гарантирует, что значение по умолчанию не изменяется между вызовами.
Ключевые моменты:
None
в качестве значения по умолчанию и создавайте новые изменяемые объекты внутри функции.