Re: [Python-de] Parameter in Python
Am 12.11.2013 17:11, schrieb Michael Ziegler:
On 12.11.2013 15:13, Achim Domma wrote:
Referenzen auf diese Objekte
Ich störe mich extrem an dem Begriff Referenzen.
Eine Variable in Python speichert ein PyObject*, also einen Pointer. Und entweder ich überschreibe den Pointer mit was neuem (ohne das alte zu verändern), oder ich verändere das, worauf der Pointer zeigt, ohne ihn zu überschreiben.
Ob das jetzt "call by reference" oder "call by value" oder "call by assignment" oder "call by object" oder was ganz anderes ist...
Hehe, ich darf Christian zitieren:
Es ist weder call-by-reference noch call-by-value. Python verwendet call-by-object. Es werden Objekte übergeben. Wenn das Objekt nicht verändert werden kann, dann kann es eben nicht verändert werden. So einfach ist das. <<
Also wenn Pointer übergeben werden, dann sind das ja keine Objekte und Christian würde falsch liegen. Ich nenne das einfach mal innerlich call-by-reference weil da mit Zeigern operiert wird :D Mir doch alles Wurst ! ^^
Am 12.11.2013 18:48, schrieb Alexander Langer:
Also wenn Pointer übergeben werden, dann sind das ja keine Objekte und Christian würde falsch liegen. Ich nenne das einfach mal innerlich call-by-reference weil da mit Zeigern operiert wird :D
Die PyObject* Pointer sind ein Implementationsdetail von CPython. Andere Implementationen (Jython, IronPython, PyPy) implementieren die Übergabe von Objekte zum Teil anders. In CPython werden Objekte intern als Referenzen (PyObject*) übergeben. Mit PyObject* kann man aber *nicht* das Objekt austauschen, d.h. Objekte über ihre Speicheradresse auszutauschen. Die API erlaubt das nur für PyObject** (Pointer of PyObject Pointer). Die CAPI unterliegt hier den selben Beschränkungen wie die Python API. Natürlich kann man sowas wie ((PyIntObject *)(ob))->ob_ival = 42; machen...
Am 12.11.2013 um 18:48 schrieb Alexander Langer <alexander.langer@address.invalid>:
Also wenn Pointer übergeben werden, dann sind das ja keine Objekte und Christian würde falsch liegen. Ich nenne das einfach mal innerlich call-by-reference weil da mit Zeigern operiert wird :D
Das Thema mit Zeigern und Listen wird beim pythontutor.com ganz nett visualisiert: http://pythontutor.com/visualize.html Ansonsten evtl. noch ein Tipp für Kopieren von Listen (für Newbies,-)
l=range(3) m=l # m ist die selbe Liste n=l[:] # n ist eine *Kopie* der Liste l m.append(4) n.append(5) l [0, 1, 2, 4] m [0, 1, 2, 4] n [0, 1, 2, 5]
Grüße, Thomas
participants (3)
-
Alexander Langer -
Christian Heimes -
Thomas Koch