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?
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:
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:
(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.
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
2- Schnelle Ausführung .
3- Sicherheit :
4- Einfach zu verwenden
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.
Tags und Links python immutability mutable