Курс 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"
- Метод index() в Python
- Библиотека wikipedia для Python
- Работа с изображениями Pillow
- Работа с модулем glob в Python
- Работа с модулем bisect
- Оператор += в Python
- enumerate() в Python для работы с индексами
- Функция format() в Python
- Объединение словарей в Python
- Проверка условий: all и any
- Создание комплексных чисел
- Построение графиков в терминале с bashplotlib
- Подсчет частоты элементов с Counter
- Основы работы с os
- Работа с контекстным менеджером Pool
- Удаление файлов в Python
- Итерация по копии коллекции
- Метод __irshift__ для Python
- Обработка исключений с блоком else
- Numpy: разбиение массивов
- Создание пар из последовательностей
- Операции с кортежами
- Запуск асинхронной корутины
- Распаковка аргументов в Python
- Объявление переменных в Python
- Сортировка элементов с OrderedDict
- Лямбда-функции в defaultdict
- Метод lt для сортировки объектов
- Метод add для класса Vector
- Работа с контекстными менеджерами
- Pillow: работа с изображениями
- Работа с Colorama
- Модуль os: работа с файлами и папками
- Объединение списков в строку
- Функция findall() для поиска вхождений строки
- Функция enumerate в Python
- Оператор «not» в Python
- Открытие, чтение и закрытие файла
- Оператор Walrus: правильное использование
- Использование модуля __future__
- Вывод с переменной через запятую
- Разрешение имен в Python
- Обмен данными с asyncio.Queue
- Модуль future Python
- Транспонирование 2D-массива с помощью zip
- Оператор «or» в Python
- Работа с YAML в Python
- Официальный канал Python в Telegram
- Аннотации типов в Python















