2014-10-12 4 views
25

Ich legte leere Klammern als Standardwert für ein optionales Argument zu einer Python-Funktion, und pylint (mit Sublime-Paket) sagte mir, es sei gefährlich. Kann jemand erklären, warum das so ist? Und ist eine bessere Alternative, stattdessen None zu verwenden?Warum ist das leere Wörterbuch in Python ein gefährlicher Standardwert?

+0

Das Problem mit pasing leere Liste als Standard Argument ist, dass es zwischen allen Aufrufen der Funktion geteilt wird - siehe die "wichtige Warnung" in https://docs.python.org/3/tuto rial/controlflow.html # default-argument-values ​​ – hamed

Antwort

32

Es ist nur gefährlich, wenn Ihre Funktion das Argument ändert. Wenn Sie ein Standardargument ändern, bleibt es bis zum nächsten Aufruf erhalten, sodass Ihr "leeres" Dict anfängt, Werte für andere als die ersten Aufrufe zu enthalten.

Ja, mit None ist in solchen Fällen sowohl sicher als auch konventionell.

+0

Wenn die Funktion das Argument nicht ändert, sollten wir im Namen der Best Practice immer noch None als Standard verwenden? – NightFurry

+0

@NightFurry: Ich zögere, hier etwas zu verschreiben - 'None' ist oft die beste Wahl, aber vielleicht nicht 100% der Zeit. Benutze dein Urteil, aber wenn du dich nicht entscheiden kannst, ist 'None' eine sichere Sache. –

35

Blick Lassen Sie uns ein Beispiel:

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

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

die Sie wahrscheinlich zu Ausgang erwarten:

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

Aber tatsächlich gibt:

{'a': 1} 
{'a': 1, 'b': 2} 
+0

danke mann! Ich habe den Grund nicht bekommen :) – maxadamo

Verwandte Themen