Comment utiliser et noter les arguments par défaut dans les fonctions Python

Affaires

La définition d'un argument par défaut dans une définition de fonction Python entraîne l'utilisation de la valeur par défaut si l'argument est omis lors d'un appel de fonction.

Les détails suivants sont décrits ci-dessous.

  • Définition des arguments par défaut
  • Contraintes sur la position des arguments par défaut
  • Notez que lorsqu'une liste ou un dictionnaire est utilisé comme valeur par défaut

Définition des arguments par défaut

Si le nom de l'argument = valeur par défaut dans la définition de la fonction, la valeur par défaut sera utilisée lorsque l'argument correspondant est omis.

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

Contraintes sur la position des arguments par défaut

Placer un argument par défaut avant un argument normal (un argument pour lequel aucune valeur par défaut n'est spécifiée) lors de la définition d'une fonction entraîne une erreur.
SyntaxError

# def func_default_error(arg2='default_a', arg3='default_b', arg1):
#     print(arg1)
#     print(arg2)

# SyntaxError: non-default argument follows default argument

Notez que lorsqu'une liste ou un dictionnaire est utilisé comme valeur par défaut

Si un objet modifiable (mutable) tel qu'une liste ou un dictionnaire est spécifié comme valeur par défaut, cet objet sera créé lorsque la fonction est définie. Ensuite, lorsque la fonction est appelée sans l'argument correspondant, le même objet est utilisé.

Les valeurs des arguments par défaut sont évaluées de gauche à droite lors de l'exécution de la définition de la fonction. Cela signifie que l'expression de l'argument par défaut n'est évaluée qu'une seule fois lorsque la fonction est définie, et que la même valeur “calculée” est utilisée pour chaque appel.
8.7. Function definitions — Python 3.10.2 Documentation

Ainsi, par exemple, si une fonction est définie qui prend une liste ou un dictionnaire comme argument par défaut et y ajoute des éléments, et qu'elle est appelée plusieurs fois sans cet argument, des éléments seront ajoutés au même objet à plusieurs reprises.

Exemple pour une liste.

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 pour un dictionnaire.

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}

Un nouvel objet est créé à chaque fois que la fonction est appelée.

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]