Как работают аргументы по умолчанию в функциях Python
Аргументы по умолчанию позволяют вызвать функцию без части параметров. Передавайте их позиционно или по имени. Не задавайте список значением по умолчанию в def, если вызовы не должны делить состояние. Разберите базовый синтаксис, порядок параметров, ловушку с общим состоянием и безопасный шаблон с None.
Обязательные параметры функции
Функция с обязательными параметрами требует значение при каждом вызове. Если аргумент пропущен, Python останавливает выполнение с ошибкой TypeError.
def func_args(integer1, integer2):
return integer1 + integer2
result = func_args(10, 20)
print(result) # 30
func_args(10)
# TypeError: func_args() missing 1 required positional argument: 'integer2'Вызов передает значение только для integer1, поэтому обязательный integer2 остается без значения.
Функция с аргументами по умолчанию
Python вычисляет значение по умолчанию один раз при выполнении объявления def. Каждый вызов без аргумента использует сохраненное значение, а явный аргумент его заменяет.
Позиционная и именованная передача
Позиционный вызов передает значения по порядку. Именованный вызов связывает значение с конкретным параметром.
def find_square(integer1=2):
return integer1 * integer1
print(find_square()) # 4
print(find_square(10)) # 100Второй вызов подставляет 10 вместо сохраненного значения 2.
def add_ints(integer1=2, integer2=4):
return integer1 + integer2
print(add_ints()) # 6
print(add_ints(10)) # 14
print(add_ints(integer2=10)) # 12
print(add_ints(integer1=5, integer2=10)) # 15Вызов add_ints(integer2=10) меняет только второй параметр. Порядок именованных аргументов при таком вызове значения не имеет.
Где хранятся значения по умолчанию
Кортеж func.__defaults__ показывает позиционные значения по умолчанию функции.
print(add_ints.__defaults__)
# (2, 4)Для изменяемого объекта этот атрибут помогает увидеть общий объект, который сохраняет данные между вызовами.
Ошибка с изменяемым значением по умолчанию
Список, словарь и множество меняют содержимое после создания. Значение по умолчанию вычисляется при выполнении def, поэтому один список остается общим для последующих вызовов.
def collect(item, items=[]):
items.append(item)
return items
print(collect("a")) # ['a']
print(collect("b")) # ['a', 'b']
print(collect.__defaults__) # (['a', 'b'],)Второй вызов получает список, измененный первым вызовом. Функция сохраняет состояние между обращениями, хотя код вызова этого не показывает.
Используйте None как признак отсутствия списка. Создавайте новый объект внутри функции при таком значении параметра.
def collect(item, items=None):
if items is None:
items = []
items.append(item)
return items
print(collect("a")) # ['a']
print(collect("b")) # ['b']Теперь каждый вызов без второго аргумента получает новый список. Чтобы разделить список намеренно, передайте один объект явно.
saved_items = []
print(collect("a", saved_items)) # ['a']
print(collect("b", saved_items)) # ['a', 'b']Порядок параметров в объявлении функции
Для позиционных и позиционно-именованных параметров обязательные параметры ставьте перед параметрами со значениями по умолчанию. Иначе Python выдаст SyntaxError.
def wrong(first=1, second):
pass
# SyntaxError: parameter without a default follows parameter with a defaultПереставьте параметры, чтобы обязательный параметр шел первым.
def right(first, second=1):
return first + second
print(right(5)) # 6
print(right(5, 10)) # 15После символа * начинаются keyword-only параметры. Для них это ограничение не действует: обязательный параметр может стоять после параметра со значением по умолчанию.
def configure(name, *, enabled=True, limit):
return name, enabled, limit
print(configure("cache", limit=10))Параметр limit обязателен, но вызов передает его только по имени. Такое объявление корректно, потому что limit относится к keyword-only параметрам.
Что запомнить о параметрах по умолчанию
Передавайте обязательные параметры всегда. Для позиционных параметров размещайте значения по умолчанию после обязательных параметров.
Не ставьте [], {} или set() в объявление функции, если состояние не должно переходить между вызовами. Для нового изменяемого объекта используйте None и проверку is None внутри функции. Для такой проверки важно понимать различие операторов is и ==.
Соседняя тема – произвольные наборы аргументов *args и **kwargs. Они принимают переменное число позиционных и именованных параметров, но не меняют правила вычисления значений по умолчанию.
Популярное за неделю
- Как создать сайт самому в 2026: 4 способа + пошаговая инструкция 34 мин чтения
- Лучшие конструкторы для создания сайтов — плюсы, минусы и сравнения 22 мин чтения
- Как читать и записывать файлы Word в Python с помощью python-docx 5 мин чтения
- Как писать условные выражения в Python 3 6 мин чтения
- Как запустить Python‑скрипт на Windows и Unix 4 мин чтения
- Как начать программировать на Python: первые шаги 6 мин чтения
Комментарии