Можно ли изменять аргументы функции, имеющие значения по умолчанию, внутри функции?

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

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

Пример:


def append_to_list(element, my_list=[]):
  my_list.append(element)
  return my_list

print(append_to_list(1))  # Output: [1]
print(append_to_list(2))  # Output: [1, 2]  (Не ожидалось, что 1 сохранится!)
print(append_to_list(3))  # Output: [1, 2, 3]
  

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

Рекомендации:

  • Используйте `None` в качестве значения по умолчанию для мутабельных аргументов.
  • Внутри функции проверяйте, является ли аргумент `None`, и, если да, инициализируйте его нужным мутабельным объектом.

Правильный пример:


def append_to_list_safe(element, my_list=None):
  if my_list is None:
    my_list = []
  my_list.append(element)
  return my_list

print(append_to_list_safe(1))  # Output: [1]
print(append_to_list_safe(2))  # Output: [2]
print(append_to_list_safe(3))  # Output: [3]
  

В этом случае, при каждом вызове функции с дефолтным значением `my_list`, создается новый пустой список.

Вывод: Изменение аргументов со значениями по умолчанию внутри функции возможно, но для мутабельных типов (списки, словари и т.д.) необходимо быть очень внимательным и использовать паттерн с `None` для избежания нежелательного поведения.

0