Miranda hat geschrieben: ↑Montag 10. Juni 2019, 23:04Ich finde das irgendwie schwer zu durchschauen, das ist doch nichts halbes und nichts ganzes?
Manchmal ist es ganz gut, Dinge nicht nur anhand eines einzigen Beispiels zu betrachten.
Was ThomasL geschrieben hat, solltest du beherzigen. In 99,99% der Fälle ist das Benutzen von globalen Variablen falsch. Es gilt: Eine Funktion bekommt die Variablen, die sie braucht, als Parameter übergeben und liefert das Ergebnis mit return zurück. Genau wie von Thomas beschrieben.
Warum kann man dann überhaupt auf Variablen des äußeren Namensraums zugreifen? Weil es für manche Variablen, sogenannte Konstanten, sinnvoll ist. Konstanten, wie der Name schon sagt, sind konstant und ändern sich nach der einmaligen Zuweisung nicht mehr. In anderen Programmiersprachen muss man die auch entsprechend deklarieren und kann sie hinterher gar nicht mehr ändern. Das wird bei Python, wie so vieles, durch Konvention gelöst. Man weiß, dass man Konstanten nicht ändert und tut das auch nicht . Es sei denn, man weiß was man tut und braucht das unbedingt.
In Python gibt es die Konvention Konstanten IN_GROSSBUCHSTABEN zu schreibe, damit jeder weiß: Alles klar, fester Wert.
Ein Beispiel wären Konstanten in der Mathematik (etwa Pi) oder so etwas wie ein fester Pfad oder die Benennung von Werten für ein leichteres Arbeiten (RED = 16, BLUE = 12 falls irgendwo Integerwerte als Farben verwendet werden). Es macht also durchaus Sinn, die "äußere" Variable in der Funktion lesen zu können. Sie ändern zu wollen, zeugt von schlechtem bis falschem Programmierstil.
Miranda hat geschrieben: ↑Montag 10. Juni 2019, 23:04Warum kann ich die Variable in der Funktion lesen, aber erst mir ihr rechnen, wenn ich sie (beispielsweise) mit eggs = 1 innerhalb der Funktion initialisiert habe.
Wenn du innerhalb der Funktion "eggs = 1" schreibst, ist das nicht mehr die selbe Variable wie in der "äußeren" Umwelt. Die Funktion hat ihren eigenen Namensraum - und das ist auch gut so.
Code: Alles auswählen
>>> def test():
i = 1
i = i + 1
print(f"i in in test: {i}")
>>> i = -5
>>> test()
i in in test: 2
>>> i
-5
>>>