Курс 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"
- Создание итератора
- Функции с необязательными аргументами
- Возврат нескольких значений
- Метод join() для объединения элементов строки
- Выражения-генераторы в Python
- Функции в Python
- Python: Splat-оператор и splatty-splat
- Профилирование данных с Pandas
- Переопределение метода __floordiv__
- Переменные класса и экземпляра
- Работа с PosixPath() в Python
- Установка и использование TensorFlow
- Запрос пароля с помощью getpass
- Расчет времени выполнения
- Объединение Python и Shell
- Работа с эмодзи в Python
- Управление ресурсами в Python
- Распаковка аргументов в Python
- Нахождение отличий в списках
- Безопасные SQL-запросы в Python 3.11
- Defaultdict в Python
- Генерация строк с .join()
- Символ подчеркивания в Python
- Основные операции с библиотекой Numpy
- Разделение строки с регулярными выражениями
- Установка User-Agent в Python
- Динамические маршруты во Flask
- Расчет времени выполнения программы
- Лямбда-функции в Python
- Удаление файлов с shutil.os.remove()
- Создание списков в Python
- Метод join() для объединения строк
- split() — разделение строки
- Многострочные строки в Python
- Метод bool() в Python
- Подсчет элементов в Python
- Декораторы в Python
- Удаление символов новой строки в Python.
- JSON-esque в Python
- Метод classmethod
- Пустой оператор pass в Python
- Поиск HTML-элементов с BeautifulSoup
- Множественные конструкторы в Python
- Структура данных словарь в Python
- Переопределение унарных операторов
- Комментарии в Python
- Подписка на каналы разработчиков
- Определение относительного пути















