====== LU02d - By Value und By Reference in Python ====== ===== Einführung ===== In Python ist es wichtig zu verstehen, wie Daten zwischen Funktionen und Variablen übergeben werden. Python verwendet sowohl ''By Value'' als auch ''By Reference'' Mechanismen, abhängig vom Datentyp. Das Verständnis dieser Konzepte hilft, den Programmfluss und das Verhalten von Variablen in verschiedenen Kontexten besser zu verstehen. ===== By Value ===== ''By Value'' bedeutet, dass der Wert einer Variable kopiert wird, wenn er an eine Funktion übergeben wird. Änderungen am kopierten Wert haben keine Auswirkungen auf die ursprüngliche Variable. In Python gilt dieses Konzept hauptsächlich für unveränderliche (immutable) Datentypen. ==== Beispiele für Immutable Datentypen ==== Zu den unveränderlichen Datentypen in Python gehören: * int (z.B. ''5'') * float (z.B. ''3.14'') * str (z.B. '''Hallo%%'%%'') * tuple (z.B. ''(1, 2, 3)'') Wenn eine Variable mit einem dieser Typen an eine Funktion übergeben wird, wird eine Kopie des Wertes erstellt. Jede Änderung innerhalb der Funktion betrifft nur die Kopie, nicht die ursprüngliche Variable. ==== Beispiel 1: By Value mit Immutable Typen ==== def modify_value(x): """ Tries to modify the immutable value by adding 10. """ x += 10 return x if name == 'main': a = 5 new_value = modify_value(a) print(f'Originaler Wert: {a}') # Output: Originaler Wert: 5 print(f'Neuer Wert: {new_value}') # Output: Neuer Wert: 15 Hier bleibt die ursprüngliche Variable ''a'' unverändert, da ''int'' ein unveränderlicher Typ ist. Die Änderung findet nur in der Kopie innerhalb der Funktion statt, und der ursprüngliche Wert bleibt erhalten. ===== By Reference ===== ''By Reference'' bedeutet, dass eine Referenz auf die Originaldaten übergeben wird, anstatt eine Kopie zu erstellen. Änderungen an diesen Daten innerhalb der Funktion beeinflussen somit die ursprüngliche Variable. In Python gilt dieses Konzept hauptsächlich für veränderbare (mutable) Datentypen. ==== Beispiele für Mutable Datentypen ==== Zu den veränderbaren Datentypen in Python gehören: * list (z.B. ''[1, 2, 3]'') * dict (z.B. ''{'a': 1, 'b': 2}'') * set (z.B. ''{1, 2, 3}'') Wenn eine Variable mit einem dieser Typen an eine Funktion übergeben wird, wird eine Referenz auf das Originalobjekt übergeben. Jede Änderung innerhalb der Funktion wirkt sich direkt auf das ursprüngliche Objekt aus. ==== Beispiel 2: By Reference mit Mutable Typen ==== def modify_list(some_list): """ Appends the value 4 to the passed list. """ some_list.append(4) if name == 'main': my_list = [1, 2, 3] modify_list(my_list) print(f'Geänderte Liste: {my_list}') # Output: Geänderte Liste: [1, 2, 3, 4] In diesem Beispiel wird die Liste ''my_list'' direkt innerhalb der Funktion geändert. Da Listen in Python mutable sind, wird die Original-Liste durch die Änderung in der Funktion beeinflusst. ===== Unterschiede und Auswirkungen ===== Die Art und Weise, wie Werte und Referenzen in Python übergeben werden, hat direkte Auswirkungen auf das Verhalten und die Vorhersagbarkeit des Codes: * **Immutable Objekte:** Änderungen in einer Funktion betreffen nur die lokale Kopie. Der Originalwert bleibt unverändert. * **Mutable Objekte:** Änderungen in einer Funktion betreffen direkt das Originalobjekt. Dies kann zu unbeabsichtigten Seiteneffekten führen, wenn die Funktion den Zustand des Objekts verändert. Um ungewollte Seiteneffekte zu vermeiden, sollten Sie sich der Datenarten bewusst sein, die Sie in Funktionen verwenden, und überlegen, ob das Objekt unverändert bleiben soll oder nicht. ===== Zusammenfassung ===== Das Verständnis von ''By Value'' und ''By Reference'' ist entscheidend für das Schreiben von klarem und wartbarem Code in Python. Immutable Objekte bieten Schutz vor unbeabsichtigten Änderungen, während mutable Objekte Flexibilität bieten, aber sorgfältig gehandhabt werden müssen, um unvorhergesehene Probleme zu vermeiden. Tipp: Wenn Sie mutable Objekte verwenden, aber unerwartete Änderungen vermeiden möchten, sollten Sie in Erwägung ziehen, eine Kopie des Objekts zu erstellen, bevor Sie es an eine Funktion übergeben.