Aber das ist, wenn ich das richtig verstehe, des Rätsels Lösung?
Bei immutable Datentypen wird also wirklich eine Kopie erstellt aber ansonsten wird eine Referenz übergeben?
Nein. Namen (in einem bestimmten Namensraum, also zb dem globalen, oder dem lokalen einer gerade ausgeführten Funktion) sind einfach Bindungen an ein beliebiges Objekt. Und da in Python alles ein Objekt ist, kann man im Grunde alles an einen Namen binden. Und das ist alles. Objekte kennen ihre Namen nicht! Die Namen sind den Objekten somit herzlich egal - ob sie an einen Namen gebunden sind oder zb in einer Liste existieren, spielt absolut keine Rolle für sie.
Alles andere ist eine Angelegenheit des Objektes selbst. Die Namen haben damit nichts mehr zu tun. Hier zb ein Objekt, welches sich "veränderlich" verhält:
Code: Alles auswählen
class MutableObject(object):
def __init__(self):
self.data = []
def __add__(self, other):
self.data.append(other)
return self
__iadd__ = __add__
(Nicht getestet, habe aktuell keinen Interpreter zur Hand.)
Wenn du jetzt dieses Objekt (auf der linken Seite) mit einem anderen Objekt addierst, kommt dabei dieses Objekt wieder zurück - allerdings wurde data verändert. Führst du also
Dann ist a das selbe Objekt wie b - a is b ergibt True.
Führ den Rest verlinke ich mal auf Numerix's Thread, da steht das nochmal - und irgendwo gabs da noch nen schönen Blogpost zu. Im Grunde ist das System sehr einfach, wenn man mal die Grundidee verstanden hat.
Wie schafft man es dann, dass ein selbstdefinierter Datentyp immutable wird?
Du solltest dich zuerst Fragen, warum ein Objekt immutable sein kann, beziehungsweise warum das Konzept eines unveränderlichen Objektes relativ sinnvoll ist.
Ein unverändliches Objekt ist ein "Wertobjekt" - es macht nur deswegen Sinn, es nicht verändern zu können, weil es selbst einen Wert darstellt. Das ist der Unterschied zu veränderlichen Objekten: Die existieren nicht um ihrer selbst Willen, sondern aus bestimmten Gründen. Ich habe in einem typischen Programm niemals eine Liste weil ich ihren Wert bräuchte - der Wert einer Liste gibt Angaben über ihren Inhalt (und in einer Weise, die für Listen sinnvoll ist - ein Dictionary implementiert natürlich eigene Methoden, seinen "Wert" zu bestimmen). Ein unverändliches Objekt, ein Wertobjekt, dagegen, brauche ich einfach um seiner selbst Willen. Stell dir vor, du hast ein Programm in dem es keine Zahl / keinen Integer Eins gibt. Du wärst aufgeschmissen. Das Objekt für die Zahl 1 stellt selbst einen Wert dar.
Wenn du eine Art unverändliches Objekt programmieren willst, musst du einfach nur dafür sorgen, daß es keine von außen zugänglichen Attribute hat, die es verändern kann. Also alle mit einem Unterstrich als "privat" markieren. Alle Methoden dürfen das Objekt (mit Ausnahme von internem Zustand, der ja grade als privat markiert wurde) nicht verändern. Brauch man unbedingt eine veränderte Version des Objektes, muss man ein neues erzeugen und zurückgeben. Und da kommt das "Wertobjekt" wieder zum Vorschein: Für alle anderen Dinge sind solche unveränderlichen / komplett unveränderlichen Objekte nicht sehr sinnvoll.
Und wie bewertet ihr persönlich das ganze Verhalten? Logisch und konsequent und vielleicht auch praktisch, oder fändet ihr es besser, wenn man Referenzen immer explizit angeben müsste, anstatt, dass hier solche Verwirrungen entstehen? So wie das in anderen Sprachen gehandhabt wird, so weit ich da informiert bin.
Ich finds gut. Klar, ist am Anfang vllt etwas verwirrend, aber das wars auch. Es läuft letztendlich nur darauf hinaus, daß das Objekt seine Verhaltensweisen selbst bestimmt und Namen nur eine Art "Zettel" an den Objekten sind, um sie im entsprechenden Namensraum zu halten und anzusprechen. Übergebe ich ein Objekt einem anderen, bestimmt dieses, wie es das erstere aufbewahrt - all das hat nichts mehr mit dem Namensraum, in welchen die Übergabe / Erzeugung stattfand, zutun. Das Verhalten ist so deutlich besser, als alle andere, was ich in anderen Sprache gesehen habe.
Hoffentlich hab ich das nicht alles zu wirr geschrieben, wenn doch, frag einfach.
Der Thread von Numerix:
http://www.python-forum.de/topic-16761.html
Der erwähnte Blogpost:
http://the-space-station.com/2008/11/22 ... -variables