In Kurzform: Vertraue uns! Globale Variablen sind eine schlechte Idee - und zwar in fast jedem Fall! Für einen Anfänger gilt dabei: Sind sie *immer* eine schlechte Idee
Stell Dir vor, die ``print``-Funktion würde gar keinen Parameter übernehmen, sondern einfach eine bestimmte globale Variable ausgeben. Hier mal ein Beispiel für diese sehr schlechte Lösung:
Code: Alles auswählen
In [1]: def myprint():
...: print(text)
...:
In [2]: text = "Hallo Welt!"
In [3]: myprint()
Hallo Welt!
In [4]: for word in "Fuchs Du hast die Gans gestohlen".split():
...: text = word
...: myprint()
...:
Fuchs
Du
hast
die
Gans
gestohlen
(Nicht von den "In []" und "Out []" verwirren lassen; das sind lediglich die Prompts der Shell IPython!)
Du siehst schön, wie umständlich das ganze ist! Zum einen wäre ``text`` quasi nie für etwas anderes nutzbar, zum anderen müsstest Du immer eine Zuweisung machen, bevor du etwas ausgeben kannst. Jetzt stell Dir vor, die Standardlib würde so vorgehen - Du müsstest Dir ja hunderte "magische" Namen merken, die Du zum einen verwalten und zum anderen selber nicht für eigene Variablen verwenden dürftest.
Es wird noch gefährlicher, wenn z.B. der Name noch nicht gebunden ist:
Code: Alles auswählen
In [6]: del text
In [7]: myprint()
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-7-1a515c1beb4a> in <module>()
----> 1 myprint()
<ipython-input-1-6085ca9e2b89> in myprint()
1 def myprint():
----> 2 print(text)
3
NameError: name 'text' is not defined
Dazu kommen noch fortgeschrittenere Sachen wie "Thread Sicherheit" usw., die das ganze noch gefährlicher und weniger kontrollierbar machen. Oder Dinge, wie das Faken von Objekten für Tests, was DasIch angesprochen hat, oder auch alles, was in den Bereich "Interception" fällt, also das "Abfangen" von Objekten und ggf. dem Verändern von deren Funktionalität zur Laufzeit (Decorator-Pattern uvm)
Auch wenn Du faktisch ein Objekt haben wirst, von dem nur ein Exemplar existieren wird, so ist das dennoch kein Grund, dieses global verfügbar zu machen. In vielen Programmen gibt es von vielen Sachen nur ein Objekt - aber man benötigt sie idR. nur für spezielle Sachen, also sollten sie auch nur in diesen Bereichen zur Verfügung stehen.
Edit: Lange nichts mehr gepostet... das Codebox-Problem ist ja ätzend!