Global erstelllte global Variable nicht gleich Global



  • Ich verstehe hier was bei Python nicht.

    Wieso wenn ich

    global data
    data = None
    

    mache, wird dann nicht eben erstellte Variable in

    def funk():
    data = ""
    

    genutzt, sondern die Variable in def funk() noch einmal neu erstellt?

    Wenn ich an vielen Orten globale Variablen erst in den

    def
    

    s per

    global
    

    erstelle, ist das doch eine hohe verwirrungsgefahr, wenn dann eine globale Variable aus einer def irgendwo global benutzt wird.

    Kann man in Python vielleicht erst

    def
    

    s mit globalen Variablen bekanntmachen? Etwas so:

    def Name():
    global Name
    global Name
    

    Und erst anderswo richtig

    def Name():
    print ""
    Andere = ""
    

    machen?



  • Dein Beitrag ist etwas konfus.

    Deshalb nur eine kurze Erklaerung zu globalen Variablen in Python.

    Eine Zuweisung zu einer Variablen gilt immer fuer den aktuellen Scope.

    foo=""
    def test():
      foo="bar"
    

    Hier wird in test ein lokales foo erstellt. Denn Zuweisung wirkt immer auf dem engsten Scope. Um nun dem globalen foo etwas zuweisen zu koennen, muss man das explizit angeben:

    def test():
      global foo
      foo="bar"
    

    Damit wird explizit gesagt, dass foo in einem anderen Scope lebt und dieser verwendet werden soll.

    Was das ganze etwas verwirrend macht ist, dass lesen von Variablen aber sehr wohl in den naechst hoeheren Scope weiter sucht. Sprich

    foo="bar"
    def test():
      print foo
    

    wuerde "bar" ausgeben.

    Die Idee von Python ist die, dass man nicht aus versehen globale Variablen ueberschreiben kann. Man kann aber ohne Probleme von ihnen lesen.

    Zur absicherung ist folgendes uebrigens nicht legal"

    foo="bar"
    def test():
      print foo
      foo="baz"
    

    da foo="baz" eine Zuweisung ist, wird im lokalen Scope ein foo erstellt und print foo bezieht sich nun darauf. Und es kommt der Fehler dass von foo gelesen wird, bevor etwas zugewiesen war.

    Ich hoffe damit ist deine Frage - die ich leider nicht verstanden habe - beantwortet. Wenn nicht, frag einfach nochmal 🙂


Anmelden zum Antworten