Ich habe festgestellt, dass viele Operationen auf Listen, die den Inhalt der Liste ändern, Folgendes zurückgeben None
anstatt die Liste selbst zurückzugeben. Beispiele:
>>> mylist = ['a', 'b', 'c']
>>> empty = mylist.clear()
>>> restored = mylist.extend(range(3))
>>> backwards = mylist.reverse()
>>> with_four = mylist.append(4)
>>> in_order = mylist.sort()
>>> without_one = mylist.remove(1)
>>> mylist
[0, 2, 4]
>>> [empty, restored, backwards, with_four, in_order, without_one]
[None, None, None, None, None, None]
Welche Überlegungen stehen hinter dieser Entscheidung?
Mir scheint dies hinderlich zu sein, da es die "Verkettung" der Listenverarbeitung verhindert (z.B. mylist.reverse().append('a string')[:someLimit]
). Ich könnte mir vorstellen, dass "die Mächtigen" entschieden haben, dass das Listenverständnis das bessere Paradigma ist (eine berechtigte Meinung), und deshalb andere Methoden nicht fördern wollten - aber es scheint pervers, eine intuitive Methode zu verhindern, selbst wenn es bessere Alternativen gibt.
Diese Frage bezieht sich speziell auf Pythons <em>Entwurfsentscheidung </em>zur Rückkehr <code>None</code> von mutierenden Listenmethoden wie <code>.append</code> . Anfänger schreiben oft falschen Code, der erwartet <code>.append</code> (insbesondere), um die gleiche Liste zurückzugeben, die gerade geändert wurde.
Für die einfache Frage nach " <strong>wie </strong>an eine Liste anhängen?" (oder Fragen zur Fehlersuche, die auf dieses Problem hinauslaufen), siehe <a href="https://stackoverflow.com/questions/6339235">Warum funktioniert "x = x.append([i])" nicht in einer for-Schleife? </a>.
Um geänderte Versionen der Liste zu erhalten, siehe:
- Für .sort: <a href="https://stackoverflow.com/questions/13573507">Wie kann ich eine sortierte Kopie einer Liste erhalten?</a>
- Für .reverse: <a href="https://stackoverflow.com/questions/4280691">Wie kann ich eine umgekehrte Kopie einer Liste erhalten (Vermeidung einer separaten Anweisung bei der Verkettung einer Methode nach .reverse)?</a>
Das gleiche Problem gilt für einige Methoden anderer eingebauter Datentypen, z. B. <code>set.discard</code> (siehe <a href="https://stackoverflow.com/questions/22877032">Wie entfernt man ein bestimmtes Element aus einer Menge innerhalb einer Liste mit Hilfe des Listenverständnisses? </a>) und <code>dict.update</code> (siehe <a href="https://stackoverflow.com/questions/1452995/">Warum gibt ein python dict.update() das Objekt nicht zurück? </a>).
Die gleichen Überlegungen gelten für die Entwicklung eigener APIs. Siehe <a href="https://stackoverflow.com/questions/13062423">Ist es eine schlechte Idee, wenn In-Place-Operationen das Objekt zurückgeben? </a>.