2014-10-12 17 views
25

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?

+0

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

risposta

32

È 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

+0

se la funzione non modifica l'argomento, dovremmo ancora usare None come default nel nome della best practice? – NightFurry

+0

@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. –

35

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} 
+0

grazie amico! Non stavo ottenendo il motivo :) – maxadamo