Задаването на аргумент по подразбиране в дефиниция на функция на 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]