Hi Alexander, On 2013-11-12 14:51, Alexander Langer wrote:
Am 12.11.2013 09:58, schrieb Stefan Schwarzer:
Im zweiten Fall wird durch die Slice-Zuweisung das übergebene Listen-Objekt selbst ("in-place") verändert, so dass diese Änderungen auch nach Verlassen der Funktion sichtbar sind. Anstelle der Slice-Zuweisung könnte jede andere Anweisung stehen, die die Liste verändert, zum Beispiel `list_.append(1)` oder `list_.pop()`.
Ja, das habe ich schon verstanden nur ist folgendes nicht "call-by-value" like:
def unchanged(list_): list2_ = list_ list2_.pop(0)
L = [1, 2, 3] unchanged(L) print L
ich halte es in der Tat nicht für glücklich, die Parameter-Übergabe in Python "call by value" zu nennen. Das führt genau so zu Missverständnissen, wie es "call by reference" zu nennen. In der "Ausbildung" werden üblicherweise vielleicht nur "call by value" und "call by reference" erklärt. Bei vielen Menschen scheint das zu der Annahme zu führen, es gäbe nichts anderes. :-)
Es geht um die Semantik. Ich halte die Aussage, das sei call-by-value schlicht für falsch.
Ich auch. Oder zumindest derart missverständlich, dass man die Semantik am besten nicht als "call by value" bezeichnen sollte.
Man kann sich darauf einigen, dass Python es anders macht und es meinteswegen call-by-assign nennen. Ungewohnt ist es trotzdem.
Wenn man vorher nur "call by value" und "call by reference" kannte, sicherlich. Ich fand es anfangs auch etwas ungewohnt.
Wie gesagt, es gibt _keine_ unterschiedliche Parameter-Übergabe für veränderliche und unveränderliche Objekte. Entscheidend ist, was du mit den Objekten innerhalb deiner Funktion/Methode machst.
Ich würde sagen die Objekte unterscheiden sich in ihrem Verhalten.
Ja (aber die Parameter-Übergabe funktioniert gleich).
Und ja, das halte ich für ein Problem weil es unerwünschte Seiteneffekte produziert.
Das kommt auf deinen Code an. Oft handelt es sich ja um _gewünschte_ Seiteneffekte. Das Musterbeispiel ist der Aufruf einer Methode mit `self` als erstem Parameter, der dann dazu verwendet kann, die Attribute des Objekts zu ändern, also das Objekt "in-place" zu verändern.
Solange man ein Bewusstsein für schafft, ist es ok.
Das denke ich auch. Ich habe mal einen Vortrag gehalten, der unter anderem auch auf Zuweisungs-Semantik und Parameter-Übergabe in Python eingeht: http://sschwarzer.com/download/robustere_python_programme_clt2010_print.pdf Viele Grüße Stefan