Wie funktionieren Seiteneffekte in Python?

3 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Das Beispiel ist wirklich nicht besonders gelungen.

Von Seiteneffekten spricht man, wenn eine Funktion neben dem offiziellen, deklarierten Effekt noch beabsichtigt oder versehentlich etwas anderes macht, mit dem man nicht rechnet.

Hier ist nicht klar, was f überhaupt machen soll. Aus dem Namen kann man keine Rückschlüsse ziehen und wenn man sich die Funktion anguckt, sieht man ja, dass der erste Wert der Liste neu gesetzt und hinten 5 neue Werte angehängt werden. Also keine überraschenden Seiteneffekte.

Edit: Nach der Lektüre von grtgrt's Link beschränkt sich meine Beschreibung wohl eher auf unerwünschte oder überraschende Seiteneffekte. Ganz Allgemein ist ein Funktion mit (Seiten)Effekt eine, die nicht nur Daten liest, sondern auch verändert. Das Beispiel ist eine verändernde Funktion.


Ruhrpotter4324 
Beitragsersteller
 09.09.2021, 20:52

Danke. Du solltest vielleicht mal Programmierbücher schreiben, denn diesen einfachen Abschnitt 2 von dir, der alles super erklärt und definiert, hat mir der Autor in 3 Buchseiten nicht zusammenfassen können.

0

Seiteneffekte sind nicht an die Verwendung einer bestimmten Programmiersprache gebunden.

https://de-academic.com/dic.nsf/dewiki/1270729

Man spricht von einem Seiteneffekt, wo Code neben beabsichtigter Wirkung auch unbeabsichtigte Wirkung hat. Das Vorhandensein letzterer kann beliebig schwer erkennbar sein, da es nicht selten sehr viele Möglichkeiten gibt, die beabsichtigte Wirkung zu implementieren.

|

Ob gegebener Code einen Seiteneffekt enthält, kann nur erkannt werden durch Vergleich der Wirkung des Codes mit einer anders gearteten Spezifikation der SOLL-Funktionalität des Programms.


tunik123  09.09.2021, 20:50

Rufe mal in einem FORTRAN-Programm (VAX-F77) die C-Funktion memcpy(), um einen Speicherbereich zu kopieren. Das klappt genau einmal, beim zweiten Mal fliegt Dir alles um die Ohren.

0
tunik123  09.09.2021, 21:15
@grtgrt

In FORTRAN werden immer alle Funktionsargumente per Referenz übergeben.

Ich schreib's mal in C++, nicht exakt, aber um das Problem zu verdeutlichen.

Rufendes Programm:
  char aText[10];
  strcpy(aText,"ABCD"); // erster Versuch
  strcpy(aText,"ABCD"); // zweiter
Sieht total harmlos aus.
Ein C-Compiler würde vor jedem Aufruf von strcpy() die beiden Pointer (Funktionsargumente) auf den Stack legen. Der FORTRAN-Compiler erzeugt beim Programmstart ein statisches Pointerfeld mit den Funktionsargumenten in der Art:
  static char *aFeld[] = { &aText, "ABCD" };
und übergibt die Adresse dieses Feldes an das Unterprogramm.
Er kommt gar nicht auf die Idee, dass jemand die Pointer selbst verändern könnte. Der C-Compiler denkt, dass die Werte sowieso auf dem Stack liegen und macht sich da keine Waffel.
In strcpy(dst,src) steht so etwas wie *pDst++ = *pSrc++ und das war's dann.

1
grtgrt  09.09.2021, 21:19
@tunik123

Womit wir hier ein Beispiel dafür haben, dass zum Erkennen unbeabsichtigter Seiteneffekte sogar noch notwendig sein kann, zu wissen, wie der jeweils genutzte Compiler arbeitet.

1
tunik123  09.09.2021, 21:21
@grtgrt

Und wir haben schon eine Weile gebraucht, um zu erkennen, was das Problem ist. (Debugger im Reassembly-Modus)

1
grtgrt  09.09.2021, 21:23
@tunik123

Kann ich mir gut vorstellen. Danke für das interessante Beispiel.

0
Woran liegt das? Daran, dass 42 oben auf den gleichen Index verweist, also 0, und deshalb ersetzt wurde?

Ja, genau.

Man möchte keine Funktionen, die irgendwas machen, was hinterher keiner erklären kann. Wenn man z.B. eine Funktionsbibliothek erstellt und anderen Programmierern zur Verfügung stellt, können die sich nicht den Quelltext der Funktionen ansehen und wundern sich halb zu Tode, was denn hier passiert ist.

(Ich kenne Python nicht, aber in anderen Programmiersprachen gibt es Bibliotheken.)

Ich habe früher in FORTRAN programmiert und mal C-Funktionen gerufen. Das kann man Sachen erleben, die man nur durch Einzelschrittbetrieb auf Maschinencode-Level erklären kann. Die Bezeichnung "Nebeneffekt" ist harmlos dagegen.