Ho messo le parentesi graffe vuote come valore predefinito per un argomento facoltativo a una funzione Python, e pylint (usando il pacchetto Sublime) mi ha detto che era pericoloso. Qualcuno può spiegare perché questo è il caso? Ed è un'alternativa migliore per usare invece None?Perché il dizionario vuoto è un pericoloso valore predefinito in Python?
risposta
È pericoloso solo se la tua funzione modificherà l'argomento. Se modifichi un argomento predefinito, esso rimarrà fino alla prossima chiamata, quindi il tuo dict "vuoto" inizierà a contenere valori su chiamate diverse dalla prima.
Sì, utilizzare None
è sicuro e convenzionale in questi casi. sguardo
se la funzione non modifica l'argomento, dovremmo ancora usare None come default nel nome della best practice? – NightFurry
@NightFurry: Esito a prescrivere qualsiasi cosa qui - "Nessuno" è spesso la scelta migliore, ma forse non il 100% delle volte. Usa il tuo giudizio, ma se non riesci a decidere, "Nessuno" è una scommessa sicura. –
Let un esempio:
def f(value, key, hash={}):
hash[value] = key
return hash
print f('a', 1)
print f('b', 2)
Il che probabilmente ci si aspetta di uscita:
{'a': 1}
{'b': 2}
Ma in realtà uscite:
{'a': 1}
{'a': 1, 'b': 2}
grazie amico! Non stavo ottenendo il motivo :) – maxadamo
Il problema con pasing elenco vuoto come default l'argomento è che sarà condiviso tra tutte le invocazioni della funzione - vedi il "avvertimento importante" in https://docs.python.org/3/tuto rial/controlflow.html # default-argument-values – hamed