Warum ist das leere Wörterbuch ein gefährlicher Standardwert in Python? [duplicate]

Lesezeit: 3 Minuten

Benutzeravatar von tscizzle
zisch

Ich habe ein dict als Standardwert für ein optionales Argument einer Python-Funktion hinzugefügt, und pylint (unter Verwendung des Sublime-Pakets) sagte mir, dass es gefährlich sei. Kann jemand erklären, warum das so ist? Und ist eine bessere Alternative zu verwenden None stattdessen?

  • Das Problem beim Übergeben einer leeren Liste als Standardargument besteht darin, dass sie von allen Aufrufen der Funktion geteilt wird – siehe die „wichtige Warnung“ in docs.python.org/3/tutorial/…

    – hamed

    18. Januar 2017 um 12:13 Uhr

Benutzeravatar von Bill Lynch
Bill Lynch

Schauen wir uns ein Beispiel an:

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

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

Was Sie wahrscheinlich erwarten, um auszugeben:

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

Aber tatsächlich gibt aus:

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

  • Wie können wir also immer noch einen Standardwert erreichen, der dem nachfolgenden Code entspricht, anstatt zu sagen: “if h is None: h = {}” und dann den Code fortzusetzen?

    – Ricky Levi

    12. Juni 2019 um 9:49 Uhr

  • @RickyLevi, ja.

    – limeri

    9. September 2020 um 18:10 Uhr

  • Ich bin etwas spät dran, aber ich wollte mich für dieses Beispiel bedanken. Dies war mir bei Python nicht bewusst, daher habe ich mich gefragt, warum eine leere Liste/ein leeres Diktat als “gefährlich” angesehen wird. Das hat sehr geholfen.

    – Mandämon

    20. Oktober 2020 um 9:12 Uhr

  • @alper ist keine globale Variable, Sie können nur im Bereich der Funktion darauf zugreifen, aber der Standardwert wird, wenn er nicht angegeben wird, auf das Diktat referenziert, das Sie als Literal definiert haben. Eine Möglichkeit, dies zu vermeiden, ist def func(hash=None): if hash == None: hash = {} …

    – Marxus

    31. Januar 2021 um 17:51 Uhr


  • Ich möchte nur sagen, dass dies ein echter Python-WTF ist. Wer hätte gedacht, dass dies möglicherweise ein vernünftiges Verhalten sein könnte?

    – Timmm

    12. August 2021 um 11:57 Uhr

Es ist nur gefährlich, wenn Ihre Funktion das Argument ändert. Wenn Sie ein Standardargument ändern, bleibt es bis zum nächsten Aufruf bestehen, sodass Ihr “leeres” Diktat beginnt, Werte für andere Aufrufe als den ersten zu enthalten.

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

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

    – Nachtpelz

    29. September 2017 um 6:43 Uhr

  • @NightFurry: Ich zögere, hier irgendetwas zu verschreiben –None ist oft die beste Wahl, aber vielleicht nicht 100 % der Zeit. Verwenden Sie Ihr Urteilsvermögen, aber wenn Sie sich nicht entscheiden können, None ist eine sichere Wette.

    – Johannes Zwinck

    30. September 2017 um 1:11 Uhr


  • Falls jemand anderes über diese Frage stolpert, sehen Sie sich bitte diese Antwort auf optionale Wörterbücher in Funktionsargumenten an. Ich denke, es ist eine viel bessere Diskussion darüber, wie dieses Problem angegangen werden sollte. Grundsätzlich sollte man heute eine optionale Zuordnung von {Schlüssel: Wert} eingeben. dh arg: Optional[Mapping[str, str]] = None

    – Inarus-Luchs

    19. Januar 2021 um 15:08 Uhr


  • Wenn die Funktion das Argument nicht ändert, aber einen Verweis darauf verliert (indem sie es zurückgibt, liefert, eine andere Funktion damit als Argument aufruft usw.), kann dasselbe Problem auftreten. ich würde empfehlen stets verwenden Noneauch wenn die Funktion sorgfältig geschrieben wurde, um solche Fehler zu vermeiden, nur damit scheinbar harmlose Änderungen an der Funktion sie nicht beschädigen können.

    – Kaya3

    28. März 2021 um 3:41 Uhr


  • Das klingt nach einem Fehler in Python, soweit ich weiß, werden sich andere dynamische Programmiersprachen nicht so verhalten

    – 27px

    18. Mai um 11:09 Uhr

1430280cookie-checkWarum ist das leere Wörterbuch ein gefährlicher Standardwert in Python? [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy