@Pekh: Ich denke man muss da zwischen "Funktionen" und "Prozeduren" unterscheiden. Bei "Funktionen" sollte man möglichst nichts verändern, also keine Seiteneffekte produzieren. Es gibt ja aber auch Funktionen, deren ausgewiesener Zweck es ist, übergebene Objekte zu verändern. Beispiel wäre die Funktion zum "Verbinden" von Dreiecken, die sich eine gemeinsame Linie teilen, die ich in einem anderen Thread gepostet hatte:
Code: Alles auswählen
def connect_triangles(triangles):
for triangle_a in triangles:
for triangle_b in triangles:
if (triangle_a is not triangle_b
and triangle_a.has_shared_line_with(triangle_b)):
triangle_a.add_neighbour(triangle_b)
triangle_b.add_neighbour(triangle_a)
Man könnte hier natürlich vorher eine Kopie von den Dreiecken machen und danach eine Liste mit den Kopien zurückgeben, aber die Fragen bei so etwas sind dann oft:
1) Brauche ich überhaupt eine Kopie oder wird in 99% der Anwendungsfälle die alte Variante gleich nach dem Aufruf der Funktion sowieso verworfen?
2) Wie tief darf/muss man überhaupt kopieren? So wirklich problemlos geht das nur bei Wertobjekten, also solchen, die keinen veränderbaren Zustand haben. Veränderbarer Zustand ist aber im Allgemeinen bei Objekten üblich.
Die zweite Frage erfordert mehr Wissen über die inneren Details von Dreiecksobjekten als man in dieser Funktion vielleicht haben möchte.