Курс 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. Python Поверхностное Копирование
  2. Переопределение метода __or__()
  3. Склеивание строк без циклов
  4. Итераторы с потерямиZIP
  5. Освоение Python
  6. Функция map() в Python
  7. Объединение списков в Python
  8. Создание уникального проекта
  9. Циклы for в Python
  10. Python 3.12: переиспользование кавычек
  11. Справка по импортированным модулям
  12. Проверка вхождения подстроки
  13. Оператор Walrus: правильное использование
  14. Переименование файлов в Python
  15. Закрытие файла в Python
  16. Проверка на палиндром
  17. История Python
  18. Регулярные выражения: метод match
  19. Основы работы с os
  20. Цепные операции в Python
  21. Бинарный поиск
  22. Сравнение объектов в Python
  23. UserString в Python
  24. Моржовый оператор в Python 3.8
  25. Класс Counter() для подсчета элементов
  26. Работа со списками
  27. Настройка логгера Logzero
  28. Установка и использование библиотеки google
  29. Удаление специальных символов с помощью re.sub
  30. Метод Enumerate() для списков
  31. Работа с Event() в threading
  32. Поиск простых чисел
  33. Декоратор Ajax required
  34. Python Менеджер контекста
  35. Оператор space-invader
  36. Поиск индексов подстроки
  37. Открытие и запись файлов
  38. Подсчет элементов с помощью Counter из collections
  39. Импорт с альтернативным именем
  40. Атрибуты объекта в Python
  41. Удаление ключа из словаря в Python
  42. Оптимизация создания строк
  43. Модуль math: константы π и e
  44. Работа со слайсами
  45. Python Enumerate

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