Les paramètres optionnels dans les fonctions Python et leurs valeurs par défaut [dupliquer]

possible Duplicate:

"Least Astonishment" en Python: L'Argument par défaut Mutable

je suis un peu confus sur la façon dont les paramètres optionnels fonctionnent dans les fonctions/méthodes Python.

j'ai le bloc de code suivant:

>>> def F(a, b=[]):
...     b.append(a)
...     return b
...
>>> F(0)
[0]
>>> F(1)
[0, 1]
>>>

pourquoi F(1) retourne [0, 1] et non [1] ?

je veux dire, ce qui se passe à l'intérieur ?

29
demandé sur Community 2011-06-22 10:29:06

2 réponses

bon doc de PyCon il y a quelques années - valeurs par défaut des paramètres expliquées . Mais fondamentalement, puisque les listes sont des objets mutables, et que les arguments de mots clés sont évalués au moment de la définition de la fonction, chaque fois que vous appelez la fonction, vous obtenez la même valeur par défaut.

La bonne façon de le faire serait:

def F(a, b=None):
    if b is None:
        b = []
    b.append(a)
    return b
39
répondu Ben Hayden 2018-01-11 15:56:49

les paramètres par défaut sont, assez intuitivement, un peu comme des variables membres sur l'objet fonction.

Les valeurs par défaut des paramètres

sont évaluées lorsque la définition de la fonction est exécutée. Cela signifie que l'expression est évaluée une seule fois, lorsque la fonction est définie, et que même "pré-calculé" valeur est utilisée pour chaque appel. Ceci est particulièrement important pour comprendre quand un paramètre par défaut est un objet mutable, tel qu'un liste ou un dictionnaire: si la fonction modifie l'objet (par exemple, en ajoutant un élément à une liste), la valeur par défaut est en effet modifiée.

http://docs.python.org/reference/compound_stmts.html#function

Les listes

sont des objets mutables; vous pouvez changer leur contenu. La bonne façon d'obtenir une liste par défaut (ou un dictionnaire, ou un ensemble) est de la créer au moment de l'exécution à la place, à l'intérieur de la fonction:

def good_append(new_item, a_list=None):
    if a_list is None:
        a_list = []
    a_list.append(new_item)
    return a_list
9
répondu Jonas Elfström 2017-02-06 10:55:44