web-dev-qa-db-fra.com

Pourquoi le dictionnaire vide est-il une valeur par défaut dangereuse en Python?

Je mets des accolades vides comme valeur par défaut pour un argument optionnel à une fonction Python, et pylint (en utilisant le paquet Sublime)) me disent que c'est dangereux. Quelqu'un peut-il expliquer pourquoi c'est le cas? une meilleure alternative pour utiliser None à la place?

68
tscizzle

Ce n'est dangereux que si votre fonction modifie l'argument. Si vous modifiez un argument par défaut, il persistera jusqu'au prochain appel. Par conséquent, votre dict "vide" commencera à contenir des valeurs pour les appels autres que le premier.

Oui, utiliser None est à la fois sûr et conventionnel.

81
John Zwinck

Regardons un exemple:

def f(value, key, hash={}):
    hash[value] = key
    return hash

print f('a', 1)
print f('b', 2)

Ce que vous vous attendez probablement à produire:

{'a': 1}
{'b': 2}

Mais en réalité, produit:

{'a': 1}
{'a': 1, 'b': 2}
99
Bill Lynch