Курс Python → Избегайте изменяемых аргументов

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

Давайте рассмотрим пример. У нас есть функция some_func, которая принимает аргумент default_arg со значением по умолчанию []. Если мы вызовем эту функцию без явного указания значения для default_arg, то при каждом вызове будет использоваться один и тот же список, который был инициализирован при определении функции. Если мы внутри функции изменим этот список, то он будет сохранен для последующих вызовов функции.


def some_func(arg=default_arg):
    arg.append(1)
    return arg

print(some_func())  # [1]
print(some_func())  # [1, 1]

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

Приведенный выше пример демонстрирует важность понимания того, как работают изменяемые аргументы по умолчанию в Python. Избегайте использования изменяемых объектов в качестве аргументов по умолчанию, если вы не уверены, как это поведение может повлиять на ваш код. Будьте внимательны и всегда тестируйте свой код, чтобы избежать неожиданных результатов.

Твои коллеги будут рады, поделись в

Автор урока

Дмитрий Комаровский
Дмитрий Комаровский

Автоматизация процессов
в КраснодарБанки.ру

Другие уроки курса "Python"

  1. Ускорение кода с помощью векторизации
  2. Установка Home Assistant
  3. Декораторы в Python
  4. Создание новой даты в Python
  5. Расширение операции побитового «и» в Python
  6. Отправка HTTP-запросов в Python
  7. Класс Counter() для подсчета элементов
  8. Проверка элементов списка условием
  9. Функции в Python
  10. Метод join() для объединения строк
  11. Получение срезов итераторов
  12. Оператор «not» в Python
  13. Работа с географическими данными в Python
  14. TypedDict для kwargs в Python 3.12
  15. Управление экспортом элементов
  16. Группировка элементов Python
  17. Хеши в Python
  18. Создание именованных кортежей в Python
  19. Очистка данных в Python
  20. Участие в сообществе @selectel
  21. UserString в Python
  22. Тестирование функции сложения
  23. Итераторы в Python
  24. Поиск уникальных элементов строкой в Python
  25. Изменение списка срезами
  26. Кортежи в Python: особенности и преимущества
  27. Создание словарей в Python
  28. Создание словарей с defaultdict
  29. Работа с эмодзи в Python
  30. Модуль math: основные функции
  31. Поиск индексов подстроки
  32. Работа с timedelta в Python
  33. Синхронизация потоков с time.sleep()
  34. Работа с часовыми поясами в Python.
  35. Создание пользовательской коллекции в Python
  36. Поиск индекса элемента в списке
  37. Управление ресурсами с контекстными менеджерами
  38. Метод add для класса Vector
  39. Генерация строк с .join()
  40. Удаление ключа из словаря в Python
  41. Списковое включение в Python
  42. Разбиение строки в Python
  43. Подсчет элементов в Python
  44. Проверка условий в Python
  45. Экранирование символов в Python

Marketello читают маркетологи из крутых компаний