Встановлення аргументу за замовчуванням у визначенні функції Python спричиняє використання значення за замовчуванням, якщо аргумент пропущено під час виклику функції.
Нижче описано наступні деталі.
- Встановлення аргументів за замовчуванням
- Обмеження на положення аргументів за замовчуванням
- Зауважте, що коли список або словник використовується як значення за замовчуванням
Встановлення аргументів за замовчуванням
Якщо ім’я аргументу = значення за замовчуванням у визначенні функції, значення за замовчуванням буде використано, коли відповідний аргумент опущено.
def func_default(arg1, arg2='default_x', arg3='default_y'): print(arg1) print(arg2) print(arg3) func_default('a') # a # default_x # default_y func_default('a', 'b') # a # b # default_y func_default('a', arg3='c') # a # default_x # c
Обмеження на положення аргументів за замовчуванням
Розміщення аргументу за замовчуванням перед звичайним аргументом (аргументом, для якого не вказано значення за замовчуванням) під час визначення функції призводить до помилки.SyntaxError
# def func_default_error(arg2='default_a', arg3='default_b', arg1): # print(arg1) # print(arg2) # SyntaxError: non-default argument follows default argument
Зауважте, що коли список або словник використовується як значення за замовчуванням
Якщо оновлюваний (змінюваний) об’єкт, такий як список або словник, вказано як значення за замовчуванням, цей об’єкт буде створено під час визначення функції. Тоді, коли функція викликається без відповідного аргументу, використовується той самий об’єкт.
Значення аргументів за замовчуванням оцінюються зліва направо, коли виконується визначення функції. Це означає, що вираз аргументу за замовчуванням оцінюється лише один раз, коли функція визначена, і для кожного виклику використовується те саме «обчислюване» значення.
8.7. Function definitions — Python 3.10.2 Documentation
Таким чином, наприклад, якщо визначена функція, яка приймає список або словник як аргумент за замовчуванням і додає до нього елементи, і викликається кілька разів без цього аргументу, елементи будуть додаватися до одного і того ж об’єкта неодноразово.
Приклад для списку.
def func_default_list(l=[0, 1, 2], v=3): l.append(v) print(l) func_default_list([0, 0, 0], 100) # [0, 0, 0, 100] func_default_list() # [0, 1, 2, 3] func_default_list() # [0, 1, 2, 3, 3] func_default_list() # [0, 1, 2, 3, 3, 3]
Приклад для словника.
def func_default_dict(d={'default': 0}, k='new', v=100): d[k] = v print(d) func_default_dict() # {'default': 0, 'new': 100} func_default_dict(k='new2', v=200) # {'default': 0, 'new': 100, 'new2': 200}
При кожному виклику функції створюється новий об’єкт.
def func_default_list_none(l=None, v=3): if l is None: l = [0, 1, 2] l.append(v) print(l) func_default_list_none() # [0, 1, 2, 3] func_default_list_none() # [0, 1, 2, 3]