Этот вопрос проверяет знание о проблемах, связанных с использованием мутабельных типов данных в качестве значений по умолчанию для аргументов функций.
Если мутабельный тип данных используется как дефолтный аргумент, то изменения, сделанные в этом объекте внутри функции, сохранятся при последующих вызовах функции. Это связано с тем, что дефолтные аргументы вычисляются только один раз при определении функции, а не при каждом вызове.
Когда в качестве значения по умолчанию для аргумента функции используется мутабельный тип данных (например, список или словарь), это может привести к непредсказуемым результатам. Проблема заключается в том, что значения по умолчанию для аргументов вычисляются только один раз при определении функции, и этот объект сохраняется между вызовами функции. Если объект изменяется в теле функции, эти изменения сохраняются и влияют на последующие вызовы функции.
Пример:
def append_to_list(value, my_list=[]):
my_list.append(value)
return my_list
print(append_to_list(1)) # Выведет [1]
print(append_to_list(2)) # Выведет [1, 2] — неожиданно, так как список изменилсяПравильным подходом будет использование неизменяемых объектов (например, None), чтобы создать новый объект каждый раз, когда функция вызывается:
def append_to_list(value, my_list=None):
if my_list is None:
my_list = []
my_list.append(value)
return my_listКогда использовать:
При использовании дефолтных значений в функциях нужно избегать мутабельных объектов для предотвращения неожиданных изменений.