[Python-de] Parameter in Python

Stefan Schwarzer sschwarzer at sschwarzer.net
Di Nov 12 15:18:01 CET 2013


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


Mehr Informationen über die Mailingliste python-de