@NoPy: In C kann man nur „by value” übergeben, das kennt nichts anderes. Es gibt dort halt den Datentyp „Pointer (of…)”, aber auch der wird als Wert übergeben.
Python und andere moderne, auch statisch typisierte Programmiersprachen, haben einfach keinen „Pointer”-Datentyp. Da gibt es nichts was man derefenzieren könnte.
Die verwaltete Speicherstelle verändern bedeutet ja den Wert zu ändern, und das geht bei nicht veränderbaren Typen per Definition nicht. Aus gutem Grund. Zeichenketten werden als Schlüssel in Abbildungen verwendet, die Fehler die da entstehen möchte ich mir gar nicht ausmalen, und bei Zahlen wurde das Problem ja schon genannt: Wenn man die Verändern könnte würde ``a = 1; <magic mit `a`>; print a + 2`` plötzlich 42 ergeben können wenn man den Wert von dem Objekt das an `a` gebunden ist zu 40 ändern könnte.
Ich vermute Du hast eine falsche Vorstellung von „Variablen” in Python. Variablen bestehen aus Name, Typ, Adresse, und Wert. Und bei Python gehören Typ *und* Adresse zum *Wert* und nicht wie bei Pascal zum Beispiel zum *Namen*. Und alles was man an einen Namen binden kann ist ein Objekt. Auch Zahlen. Die werden von der Spezifikation nicht besonders behandelt. Was Du hier als praktisch ansiehst ist das
Code: Alles auswählen
def f(<magie>x):
x = 23
def main():
a = 42
f(a)
print a
if __name__ == '__main__':
main()
jetzt plötzlich 23 ausgibt. Du willst also keinen Wert verändern sondern durch einen Aufruf die Bindung des lokalen Namens beim Aufrufer ändern. Und das geht, IMHO Gott sei Dank, nicht. Denn damit rechnet beim lesen von `main()` niemand· Warum sollte man das auch wollen? Warum kann `f` den Wert nicht zurückgeben und man bindet das in `main()` explizit an `a`. Ist doch viel deutlicher. In C ist das nützlich um mehr als einen Wert zurückgeben zu können, aber in Python kann man einfach ein Tupel mit Werten zurückgeben und die per „unpacking” zuweisen. Was ich viel übersichtlicher finde als sich mit Zeigertypen und (de)referenzieren zu beschäftigen.
Die manuelle Speicherverwaltung frisst meine Zeit. Was bedeutet denn der der angefordert hat muss auch wieder freigeben in einem komplexeren System mit Funktionen die Speicher anfordern und einen Zeiger in einen Container-Datentyp stecken den Container dann als Rückgabewert liefern. Man muss sich bei so etwas immer Gedanken machen ob man nun einen Wert oder einen Zeiger hat, wer möglicherweise noch Zeiger auf oder in den Wertspeicherbereich hat, und ob und wann man den Speicher wieder freigeben kann oder das noch nicht tun darf. Oder man kopiert immer alles was irgend geht als Werte in der Gegend herum, macht sich damit aber den Effizienz-Vorteil zunichte den Verfechter von manueller Speicherverwaltung immer anführen, weil sie dann mehr Kontrolle über den Speicherverbrauch haben. Klar hat man mehr Kontrolle, dummerweise *muss* man die auch gewissenhaft ausüben, also auch wenn man dadurch gar keine Vorteile hat oder die gar nicht braucht.