Курс 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. Функции с необязательными аргументами
  3. Возврат нескольких значений
  4. Метод join() для объединения элементов строки
  5. Выражения-генераторы в Python
  6. Функции в Python
  7. Python: Splat-оператор и splatty-splat
  8. Профилирование данных с Pandas
  9. Переопределение метода __floordiv__
  10. Переменные класса и экземпляра
  11. Работа с PosixPath() в Python
  12. Установка и использование TensorFlow
  13. Запрос пароля с помощью getpass
  14. Расчет времени выполнения
  15. Объединение Python и Shell
  16. Работа с эмодзи в Python
  17. Управление ресурсами в Python
  18. Распаковка аргументов в Python
  19. Нахождение отличий в списках
  20. Безопасные SQL-запросы в Python 3.11
  21. Defaultdict в Python
  22. Генерация строк с .join()
  23. Символ подчеркивания в Python
  24. Основные операции с библиотекой Numpy
  25. Разделение строки с регулярными выражениями
  26. Установка User-Agent в Python
  27. Динамические маршруты во Flask
  28. Расчет времени выполнения программы
  29. Лямбда-функции в Python
  30. Удаление файлов с shutil.os.remove()
  31. Создание списков в Python
  32. Метод join() для объединения строк
  33. split() — разделение строки
  34. Многострочные строки в Python
  35. Метод bool() в Python
  36. Подсчет элементов в Python
  37. Декораторы в Python
  38. Удаление символов новой строки в Python.
  39. JSON-esque в Python
  40. Метод classmethod
  41. Пустой оператор pass в Python
  42. Поиск HTML-элементов с BeautifulSoup
  43. Множественные конструкторы в Python
  44. Структура данных словарь в Python
  45. Переопределение унарных операторов
  46. Комментарии в Python
  47. Подписка на каналы разработчиков
  48. Определение относительного пути

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