Gibt es in Python einen Unterschied zwischen Aufrufen clear()
und Zuweisen {}
zu einem Wörterbuch? Wenn ja, was ist das? Beispiel:
d = {"stuff":"things"}
d.clear() #this way
d = {} #vs this way
python
dictionary
Marcin
quelle
quelle
Antworten:
Wenn Sie eine andere Variable haben, die sich ebenfalls auf dasselbe Wörterbuch bezieht, gibt es einen großen Unterschied:
Dies liegt daran, dass beim Zuweisen
d = {}
ein neues, leeres Wörterbuch erstellt und derd
Variablen zugewiesen wird. Dadurch wirdd2
auf das alte Wörterbuch verwiesen, in dem sich noch Elemente befinden. Jedochd.clear()
löscht das gleiche Wörterbuch , dassd
undd2
beiden Punkte , an.quelle
d = {}
erstellt eine neue Instanz für,d
aber alle anderen Verweise verweisen weiterhin auf den alten Inhalt.d.clear()
setzt den Inhalt zurück, aber alle Verweise auf dieselbe Instanz sind weiterhin korrekt.quelle
Zusätzlich zu den in anderen Antworten erwähnten Unterschieden gibt es auch einen Geschwindigkeitsunterschied. d = {} ist doppelt so schnell vorbei:
quelle
d = {}
sollte die Einstellung schneller sein, da die Bereinigung des Ganzen für später dem Garbage Collector überlassen werden kann.Zur Veranschaulichung der bereits erwähnten Dinge:
quelle
.clear
das Objekt geändert wird, aber `= {}` ein neues Objekt erstellt.Zusätzlich zu @odanos Antwort scheint die Verwendung
d.clear()
schneller zu sein, wenn Sie das Diktat mehrmals löschen möchten.Das Ergebnis ist:
quelle
Mutationsmethoden sind immer dann nützlich, wenn das ursprüngliche Objekt nicht im Gültigkeitsbereich liegt:
Durch erneutes Zuweisen des Wörterbuchs wird ein neues Objekt erstellt und das ursprüngliche Objekt nicht geändert.
quelle
Eine Sache, die nicht erwähnt wird, ist das Scoping von Problemen. Kein gutes Beispiel, aber hier ist der Fall, in dem ich auf das Problem gestoßen bin:
Die Lösung ist zu ersetzen
c_kwargs = {}
mitc_kwargs.clear()
Wenn sich jemand ein praktischeres Beispiel ausdenkt, können Sie diesen Beitrag bearbeiten.
quelle
global c_kwargs
würde wohl auch nein funktionieren? Obwohl es wahrscheinlichglobal
nicht das Beste ist, viel davon zu verwenden.global
würde dazu führen, dass sich die Funktion anders verhält - alle Aufrufe von conf_decorator würden dann dieselbe Variable c_kwargs verwenden. Ich glaube, Python 3 hat dasnonlocal
Schlüsselwort hinzugefügt , um dieses Problem zu beheben, und das würde funktionieren.Außerdem kann die Diktatinstanz manchmal eine Unterklasse von Dikt sein (
defaultdict
zum Beispiel). In diesem Fall wird die Verwendungclear
bevorzugt, da wir uns nicht an den genauen Typ des Diktats erinnern müssen und auch doppelten Code vermeiden müssen (Kopplung der Clearing-Linie mit der Initialisierungslinie).quelle