L’establiment d’un argument predeterminat en una definició de funció de Python fa que s’utilitzi el valor predeterminat si s’omet l’argument durant una trucada de funció.
A continuació es descriuen els detalls següents.
- Configuració d’arguments per defecte
- Restriccions a la posició dels arguments per defecte
- Tingueu en compte que quan s’utilitza una llista o un diccionari com a valor predeterminat
Configuració d’arguments per defecte
Si nom de l’argument = valor per defecte a la definició de la funció, el valor per defecte s’utilitzarà quan s’omet l’argument corresponent.
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
Restriccions a la posició dels arguments per defecte
Col·locar un argument per defecte abans d’un argument normal (un argument per al qual no s’especifica cap valor per defecte) quan es defineix una funció provoca un error.SyntaxError
# def func_default_error(arg2='default_a', arg3='default_b', arg1): # print(arg1) # print(arg2) # SyntaxError: non-default argument follows default argument
Tingueu en compte que quan s’utilitza una llista o un diccionari com a valor predeterminat
Si s’especifica un objecte actualitzable (mutable) com una llista o un diccionari com a valor predeterminat, aquest objecte es crearà quan es definisca la funció. Aleshores, quan es crida la funció sense l’argument corresponent, s’utilitza el mateix objecte.
Els valors dels arguments per defecte s’avaluen d’esquerra a dreta quan s’executa la definició de la funció. Això vol dir que l’expressió d’argument predeterminada només s’avalua una vegada quan es defineix la funció i s’utilitza el mateix valor “calculat” per a cada trucada.
8.7. Function definitions — Python 3.10.2 Documentation
Així, per exemple, si es defineix una funció que pren una llista o un diccionari com a argument per defecte i hi afegeix elements, i s’anomena diverses vegades sense aquest argument, s’afegiran elements al mateix objecte repetidament.
Exemple d’un llistat.
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]
Exemple per a un diccionari.
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}
Es crea un objecte nou cada cop que es crida la funció.
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]