Establecer un argumento predeterminado nunha definición de función Python fai que se use o valor predeterminado se o argumento se omite durante unha chamada de función.
A continuación descríbense os seguintes detalles.
- Establecemento de argumentos predeterminados
- Restricións na posición dos argumentos predeterminados
- Teña en conta que cando se usa unha lista ou dicionario como valor predeterminado
Establecemento de argumentos predeterminados
Se o nome do argumento = valor predeterminado na definición da función, o valor predeterminado utilizarase cando se omita o argumento correspondente.
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
Restricións na posición dos argumentos predeterminados
Colocar un argumento predeterminado antes dun argumento normal (un argumento para o que non se especifica ningún valor predeterminado) ao definir unha función provoca un erro.SyntaxError
# def func_default_error(arg2='default_a', arg3='default_b', arg1): # print(arg1) # print(arg2) # SyntaxError: non-default argument follows default argument
Teña en conta que cando se usa unha lista ou dicionario como valor predeterminado
Se se especifica un obxecto actualizable (mutable) como unha lista ou un dicionario como valor predeterminado, ese obxecto crearase cando se defina a función. Despois, cando se chama a función sen o argumento correspondente, utilízase o mesmo obxecto.
Os valores dos argumentos predeterminados avalíanse de esquerda a dereita cando se executa a definición da función. Isto significa que a expresión do argumento predeterminada só se avalía unha vez cando se define a función e que se usa o mesmo valor “calculado” para cada chamada.
8.7. Function definitions — Python 3.10.2 Documentation
Así, por exemplo, se se define unha función que toma unha lista ou dicionario como argumento predeterminado e engade elementos a ela, e se chama varias veces sen ese argumento, engadiranse elementos ao mesmo obxecto repetidamente.
Exemplo de listaxe.
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]
Exemplo para un dicionario.
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}
Créase un novo obxecto cada vez que se chama á función.
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]