Warum sind ganze Zahlen in Python unveränderlich? [Duplikat]

9

Ich verstehe die Unterschiede zwischen veränderbaren und unveränderlichen Objekten in Python. Ich habe viele Beiträge gelesen, die die Unterschiede diskutieren. Ich habe jedoch nichts darüber gelesen, warum Ganzzahlen unveränderliche Objekte sind.

Gibt es einen Grund dafür? Oder ist die Antwort "so ist es eben"?

Bearbeiten: Ich werde aufgefordert, diese Frage von anderen Fragen zu unterscheiden, da es sich um eine zuvor gestellte Frage handelt. Ich glaube jedoch, dass das, was ich frage, eher eine philosophische Python-Frage als eine technische Python-Frage ist.

Es scheint, dass "primitive" Objekte in Python (d. h. Strings, Booleans, Zahlen usw.) unveränderlich sind. Ich habe auch bemerkt, dass abgeleitete Datentypen, die aus Primitiven (d. H. Dicts, lists, classes) bestehen, änderbar sind.

Ist das, wo die Linie gezeichnet wird, ob ein Objekt veränderbar ist oder nicht? Primitiv vs abgeleitet?

    
Izzo 31.05.2016, 01:54
quelle

2 Antworten

11

Wenn ganze Zahlen änderbar wären, wäre das sehr konträr zu der Art, wie wir es gewohnt sind, mit ihnen zu arbeiten.

Betrachten Sie dieses Codefragment:

%Vor%

Nachdem diese Zuweisungen ausgeführt wurden, erwarten wir, dass a den Wert 1 und b den Wert 3 hat. Die Additionsoperation erstellt einen neuen ganzzahligen Wert aus der Ganzzahl gespeichert in a und einer Instanz der Ganzzahl 2. Wenn die Additionsoperation nur die Ganzzahl in a genommen und einfach mutiert hat, dann hätten sowohl a als auch b den Wert 3.

Wir erwarten also, dass arithmetische Operationen neue Werte für ihre Ergebnisse erzeugen - nicht um ihre Eingabeparameter zu verändern.

Es gibt jedoch Fälle, in denen die Mutation einer Datenstruktur bequemer und effizienter ist. Nehmen wir an, dass list.append(x) list nicht geändert hat, aber eine neue Kopie von list mit x angehängt hat. Dann eine Funktion wie folgt:

%Vor%

würde nur die leere Liste zurückgeben. (Denken Sie daran - hier ändert nums.append(x) nicht nums - es gibt eine neue Liste mit angehängtem x zurück. Diese neue Liste wird jedoch nirgends gespeichert.)

Wir müssten die Routine foo wie folgt schreiben:

%Vor%

(Dies ist der Situation mit Python-Strings bis etwa 2.6 oder vielleicht 2.5 sehr ähnlich.)

Außerdem würden wir jedes Mal, wenn wir nums = nums.append(x) zuweisen, eine Liste kopieren, die an Größe zunimmt, was zu einem quadratischen Verhalten führt. Aus diesen Gründen machen wir Listen veränderbare Objekte.

Eine Konsequenz daraus, Listen änderbar zu machen, ist das nach diesen Aussagen:

%Vor%

Die Liste b wurde in [1,2,3,4] geändert. Das ist etwas, mit dem wir leben, obwohl es uns immer wieder stolpert.

    
ErikR 31.05.2016, 02:27
quelle
2

Wie lauten die Designentscheidungen, um Zahlen in Python unveränderlich zu machen?

Es gibt mehrere Gründe für die Unveränderbarkeit, sehen wir zuerst Was sind die Gründe für die Unveränderbarkeit?

1- Speicher

  • Speichert Speicher. Wenn bekannt ist, dass ein Objekt unveränderlich ist, kann es leicht kopiert werden, indem eine neue Referenz auf dasselbe Objekt erstellt wird.
  • Leistung. Python kann zum Zeitpunkt der Erstellung Speicherplatz für ein unveränderliches Objekt reservieren, und die Speicheranforderungen sind fest und unveränderlich.

2- Schnelle Ausführung .

  • Es muss nicht jedes Teil des Objekts kopiert werden, nur eine einfache Referenz.
  • Einfach zu vergleichen, Vergleich der Gleichheit durch Referenz ist schneller als der Vergleich von Werten.

3- Sicherheit :

  • In Multithreading-Anwendungen Verschiedene Threads können mit Daten interagieren, die in den unveränderlichen Objekten enthalten sind, ohne sich um die Datenkonsistenz kümmern zu müssen.
  • Der interne Status Ihres Programms ist konsistent, selbst wenn Sie Ausnahmen haben.
  • Klassen sollten unveränderlich sein, es sei denn, es gibt einen sehr guten Grund, sie veränderlich zu machen ... Wenn eine Klasse nicht unveränderbar gemacht werden kann, schränken Sie ihre Veränderlichkeit so weit wie möglich ein.

4- Einfach zu verwenden

  • Ist einfacher zu lesen, leichter zu warten und weniger wahrscheinlich auf seltsame und unvorhersehbare Weise zu versagen.
  • Unveränderliche Objekte sind leichter zu testen, nicht nur wegen ihrer einfachen Mockbarkeit, sondern auch wegen der Codemuster, die sie zu erzwingen versuchen.

5- Schlüssel müssen unveränderlich sein . Das bedeutet, dass Sie Zeichenfolgen, Zahlen oder Tupel als Wörterbuchschlüssel verwenden können. Dies ist etwas, das Sie verwenden möchten.

%Vor%

Zurück zu den ganzen Zahlen:

  • Sicherheit ( 3 ), Benutzerfreundlichkeit ( 4 ) und die Verwendung von Zahlen als Schlüssel in Wörterbüchern ( 5 ) sind Gründe für die Entscheidung, Zahlen unveränderlich zu machen.

  • Hat seit der Erstellungszeit feste Speicheranforderungen ( 1 ).

  • Alles in Python ist ein Objekt, die Zahlen (wie Strings) sind "elementare" Objekte. Keine Menge an Aktivität wird den Wert 8 zu irgendetwas anderem ändern, und keine Menge an Aktivität wird die Zeichenfolge "acht" zu irgendetwas anderem verändern. Dies ist, weil eine Entscheidung im Design auch.

Facundo Victor 31.05.2016 04:19
quelle

Tags und Links