Verweise auf Mutables (z. B. Listen) als Werte in Python-Wörterbüchern - Was ist Best Practice?

9

Es ist möglich, einen Wörterbuchschlüssel einem Wert zuzuordnen, der eine Referenz auf a ist veränderbares Objekt, z. B. eine Liste. Ein solches Listenobjekt kann durch Aufruf geändert werden eine Listenmethode für die Referenz, und die Änderungen werden in der Wörterbuch. Dies wird diskutiert in:

Meine Frage

Ist es eine gute Idee , einen Wörterbuchschlüssel der Referenz eines mutable zuzuordnen? Objekt im Gegensatz zum Zuordnen des Schlüssels zu einem unbenannten Wert?

Mit anderen Worten, es ist besser, ein Wörterbuch mit zu erstellen:

%Vor%

oder:

%Vor%

Und ist es besser, einen Wörterbuchwert zu ändern, obwohl dieser Wert zitiert wird? durch Bezugnahme, z.B.:

%Vor%

oder nach seinem Wörterbuchindex:

%Vor%

Diskussion und Forschung

Eine Referenz stellt ein nettes Handle zur Verfügung, das die Lesbarkeit von beispielsweise a verbessern kann Funktion. Soweit ich das beurteilen kann, ist die Tatsache, dass ein Wörterbuchwert war Ursprünglich an eine Referenz gebunden, ist verloren, sobald der Wert erstellt wurde. man kann nicht Diese Tatsache sehen Sie, wenn Sie ein Wörterbuch anzeigen.

Auf der anderen Seite bin ich mir nicht sicher, ob das wichtig ist, denn die Referenz und die Wert ist das gleiche Objekt, und wenn man die Referenz löscht, das Wertobjekt selbst bleibt.

Wie ich es sehe:

%Vor%

Im Verzeichnis x wird der Schlüssel 'a' auf den Wert somelist abgebildet, obwohl das nicht der Fall ist Sehen Sie sich einen Weg an, um zu überprüfen, ob der Wert mit der Referenz verknüpft ist somelist .

%Vor%

Dies bestätigt, dass die Liste, die ich als Wert sehe, mit dem Objekt identisch ist gezeigt von somelist .

%Vor%

Da der Wert von 'a' im Verzeichnis x eine Liste ist, kann ich ein Element entfernen aus der Liste mit der Listenmethode remove für Objekt x['a'] .

%Vor%

Alternativ kann ich die Methode remove für das Objekt somelist verwenden.

%Vor%

Ich kann den Verweis auf die Liste löschen, aber das Listenobjekt selbst bleibt erhalten als der Wert, der dem Schlüssel a zugeordnet ist.

%Vor%     
Tom Baker 17.06.2015, 04:25
quelle

2 Antworten

3

Wie ich Ihre Frage verstehe, ist die Antwort, dass es abhängt, was Sie tun möchten. Wenn Sie den Wörterbuchwert auf eine unabhängige Kopie eines anderen Werts festlegen möchten, erstellen Sie eine Kopie. Wenn Sie es auf das gleiche Objekt setzen möchten, dann erstellen Sie keine Kopie.

In einigen Fällen möchten Sie, dass sich das Wörterbuch auf dasselbe Objekt wie andere Referenzen bezieht, da dies dem Wörterbuch ermöglicht, Änderungen an diesem Objekt zu "sehen". In einigen Fällen möchten Sie möglicherweise, dass das Wörterbuch eine eigene Kopie hat, weil Sie nicht möchten, dass anderer Code, der das Objekt verändert, Ihr Wörterbuch beeinflusst. Es hängt nur davon ab, was das veränderbare Objekt ist und wie sein Code es als Ganzes benutzt.

    
BrenBarn 17.06.2015, 04:48
quelle
0

Erstens ist es in Ordnung, veränderbare Werte in einem Wörterbuch zu verwenden. Dies ist kein Anti-Pattern. Wenn Sie nicht brauchen , um eine Liste zu kopieren, dann tun Sie das nicht. Es ist zusätzliche Arbeit, also sei faul und mach es nicht.

Zweitens, während es Fälle gibt, in denen ich zwei Referenzen auf ein veränderbares Objekt habe, scheinen diese selten zu sein. Ich würde argumentieren, dass Sie die Anzahl dieser Fälle minimieren möchten, weil potenziell verwirrend sein kann, wenn zwei verschiedene Namen im selben Bereich auf dasselbe Objekt zeigen. Aber wenn Sie somelist und x['a'] auf dasselbe Objekt zeigen, verwenden Sie das, was am deutlichsten ist. Ersteres wird schneller , aber nicht viel, und wird keine große Geschwindigkeitsverbesserung sein, wenn es nicht in einer engen Schleife geschrieben wird. Also geh mit was liest am besten.

    
jme 17.06.2015 04:44
quelle

Tags und Links