Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
modul:m323:learningunits:lu02:byvaluebyreference [2024/08/28 08:58] – [Beispiele für Immutable Datentypen] kmaurizimodul:m323:learningunits:lu02:byvaluebyreference [2026/08/25 09:00] (aktuell) – Interaktive Animation zum Speichermodell ergänzt admin
Zeile 1: Zeile 1:
- 
 ====== LU02d - By Value und By Reference in Python ====== ====== LU02d - By Value und By Reference in Python ======
  
Zeile 5: Zeile 4:
  
 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. 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.
 +
 +===== Animation: Was im Speicher wirklich passiert =====
 +
 +Die folgende Animation zeigt Schritt für Schritt, was beim Aufruf einer Funktion im Arbeitsspeicher geschieht – einmal mit einer Zahl (''int'') und einmal mit einer Liste (''list''). Links sehen Sie die **Namen** (Variablen), rechts die **Objekte**; ein Pfeil bedeutet «dieser Name zeigt auf dieses Objekt».
 +
 +Klicken Sie sich mit **Weiter** durch beide Beispiele und vergleichen Sie insbesondere **Schritt 3**: Bis dorthin sind die beiden Abläufe identisch – erst dort trennen sich die Wege.
 +
 +{{url>https://templates-python.github.io/m323_html/lu02/byvalue-byreference.html 100%,780px noborder|Animation: By Value und By Reference}}
  
 ===== By Value ===== ===== By Value =====
Zeile 30: Zeile 37:
     x += 10     x += 10
     return x     return x
-if name == 'main': +     
-a = 5 +     
-new_value = modify_value(a) +if __name__ == '__main__': 
-print(f'Originaler Wert: {a}') # Output: Originaler Wert: 5 +    a = 5 
-print(f'Neuer Wert: {new_value}') # Output: Neuer Wert: 15+    new_value = modify_value(a) 
 +    print(f'Originaler Wert: {a}') # Output: Originaler Wert: 5 
 +    print(f'Neuer Wert: {new_value}') # Output: Neuer Wert: 15
 </code> </code>
  
-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.+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. 
 + 
 +<WRAP center round info 90%> 
 +**Genauer betrachtet:** Streng genommen kopiert Python auch hier nichts – auch der ''int'' wird als Referenz übergeben (siehe Schritt 2 der Animation). Weil ''int'' aber //immutable// ist, kann ''x += 10'' das Objekt gar nicht verändern und erzeugt stattdessen ein neues. Das Ergebnis sieht deshalb aus wie ''By Value''. 
 +</WRAP>
  
 ===== By Reference ===== ===== By Reference =====
Zeile 47: Zeile 60:
 Zu den veränderbaren Datentypen in Python gehören: Zu den veränderbaren Datentypen in Python gehören:
  
-list (z.B. [1, 2, 3]) +  * list (z.B. ''[1, 2, 3]'') 
-dict (z.B. {'a': 1, 'b': 2}) +  * dict (z.B. ''{'a': 1, 'b': 2}'') 
-set (z.B. {1, 2, 3})+  * 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. 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.
  
Zeile 60: Zeile 74:
     """     """
     some_list.append(4)     some_list.append(4)
-if name == 'main': +     
-my_list = [1, 2, 3] +     
-modify_list(my_list) +if __name__ == '__main__': 
-print(f'Geänderte Liste: {my_list}') # Output: Geänderte Liste: [1, 2, 3, 4]+    my_list = [1, 2, 3] 
 +    modify_list(my_list) 
 +    print(f'Geänderte Liste: {my_list}') # Output: Geänderte Liste: [1, 2, 3, 4]
 </code> </code>
  
Zeile 72: Zeile 88:
 Die Art und Weise, wie Werte und Referenzen in Python übergeben werden, hat direkte Auswirkungen auf das Verhalten und die Vorhersagbarkeit des Codes: 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. +  * **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.+  * **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. 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.
  
Zeile 83: Zeile 99:
 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. 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.
 </WRAP> </WRAP>
 +
 +----
 +{{tag>M323-LU02 M323-A1I}}
 +[[https://creativecommons.org/licenses/by-nc-sa/4.0/ch/|{{https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png}}]] (c) Kevin Maurizi 
 +
  • modul/m323/learningunits/lu02/byvaluebyreference.1724828287.txt.gz
  • Zuletzt geändert: 2024/08/28 08:58
  • von kmaurizi