Globale Variable nicht anerkannt?

Code-Stücke können hier veröffentlicht werden.
Antworten
Mosnum
User
Beiträge: 7
Registriert: Mittwoch 27. April 2022, 09:19

def grundfunktion():
variable = "Inhalt innerhalb gesetzt"

def fkt_local():
variable = "Inhalt innerhalb local"

def fkt_nonlocal():
nonlocal variable
variable = "Inhalt innerhalb nonlocal"

def fkt_global():
global variable
variable = "Inhalt innerhalb global"

print("2. in Fkt:", variable)
fkt_local()
print("3. in Fkt - fkt_local aufgerufen: ", variable)
fkt_nonlocal()
print("4. in Fkt - fkt_nonlocal aufgerufen: ", variable)
fkt_global()
print("5. in Fkt - fkt_global aufgerufen: ", variable)


print("1. vor Funktionsaufruf: ", variable)
grundfunktion()
print("6. nach Funktionsaufruf:", variable)

Warum spuckt er mir bei 5. : "

in Fkt - fkt_global aufgerufen: Inhalt innerhalb nonlocal"

und nicht

"in Fkt – flt_global aufgerufen: Inhalt innerhalb global"

aus....

Danke im Voraus
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Du solltest deinen Code hier immer in Code-Tags setzen. Die erscheinen automatisch, wenn du den </> Button im vollständigen Editor drückst. Dazwischen gehört dein Code.

Und dann vergisst du am besten gleich wieder, dass es global überhaupt gibt. Der Einsatz von globalen Variablen macht ein Programm unübersicht, unwartbar und ein Zustand ist unvorhersehbar, weil er im kompletten Programm gesucht werden muss.
Verwende Funktionen so, dass sie alles, was sie brauchen, als Parameter bekommen und ihr Ergebnis mit return zurück geben. Dann machst du alles richtig. Wenn du eine Variable (keine Konstante) verwendest, die nicht im aktuellen Namensraum der Funktion definiert wurde, ist es falsch.

Auch schlimm - und das sieht man nicht, weil die Einrückung im Forum wegen der fehlenden Code-Tags verloren geht - ist das verschachteln von Funktionen. Das kann Sinn machen, zum Beispiel, wenn man einen Wrapper schreibt, aber Funktionen als Ordnungsstruktur zu verwenden ist unnötig. Und das ist die Antwort auf deine Frage: Es gibt gar keine globale Variable "variable". Und die wird nicht global, nur weil du es davor schreibst.

Der hier gezeigte Code funktioniert auch gar nicht, weil du "variable" verwendest, bevor sie definiert ist.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Mosnum: ich vermute mal, dass es sich hier nur um Code handelt, um die Namensräume von Python kennenzulernen, denn solch einen Code schreibt man nicht in realen Programmen.

Code: Alles auswählen

variable = 'global'
def grundfunktion():
    variable = "Inhalt innerhalb gesetzt"

    def fkt_local():
        variable = "Inhalt innerhalb local"
        print("gesetzt", variable)

    def fkt_nonlocal():
        nonlocal variable
        variable = "Inhalt innerhalb nonlocal"
        print("gesetzt", variable)

    def fkt_global():
        global variable
        variable = "Inhalt innerhalb global"
        print("gesetzt", variable)

    print("2. in Fkt:", variable)
    fkt_local()
    print("3. in Fkt - fkt_local aufgerufen: ", variable)
    fkt_nonlocal()
    print("4. in Fkt - fkt_nonlocal aufgerufen: ", variable)
    fkt_global()
    print("5. in Fkt - fkt_global aufgerufen: ", variable)
Es gibt den globalen Namensraum mit der Variable `variable`.
Es gibt den Namensraum von `grundfunktion`, in dem eine lokale Variable `variable` existiert.
Der Namensraum von `grundfunktion/fkt_local` hat eine andere lokale Variable `variable`.
Im Namensraum von `grundfunktion/fkt_nonlocal` wird per `nonlocal` die Variable des übergeordneten Namensraum (von `grundfunktion`) verwendet.
Im Namensraum von `grundfunktion/fkt_global` wird per `global` die Variable `variable` aus dem globalen Namensraum eingebunden.
Ausgegeben bei Punkt 5 wird aber weiterhin die lokale Variable des Namensraums `grundfunktion`.
Mosnum
User
Beiträge: 7
Registriert: Mittwoch 27. April 2022, 09:19

Code: Alles auswählen


variable = "Inhalt außerhalb gesetzt"


def grundfunktion():
    variable = "Inhalt innerhalb gesetzt"

    def fkt_local():
        variable = "Inhalt innerhalb local"

    def fkt_nonlocal():
        nonlocal variable
        variable = "Inhalt innerhalb nonlocal"

    def fkt_global():
        global variable
        variable = "Inhalt innerhalb global"

    print("2. in Fkt:", variable)
    fkt_local()
    print("3. in Fkt - fkt_local aufgerufen: ", variable)
    fkt_nonlocal()
    print("4. in Fkt - fkt_nonlocal aufgerufen: ", variable)
    fkt_global()
    print("5. in Fkt - fkt_global aufgerufen: ", variable)


print("1. vor Funktionsaufruf: ", variable)
grundfunktion()
print("6. nach Funktionsaufruf:", variable)

Das hier ist der Code. Hab die obere Zeile verpasst. Genau es geht nur um das lernen von Namensräumen. Auf dieser Website (hoffe verlinken ist ok) https://www.python-lernen.de/rueckgabew ... tionen.htm wurde gesagt was unten angezeigt werden soll, bei mir kommt aber was anderes.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Meine Erklärung ist korrekt. Leider gibt es keine Qualitätskontrolle bei Tutorials im Internet, da darf jeder alles veröffentlichen, oft mit Halbwissen und krachenden Fehlern übersät.
Wenn dann noch kommerzielle Interessen dazukommen, weil ein Buch (mit den selben Fehlern) verkauft werden soll, dann bleibt die Qualität noch mehr auf der Strecke.
Antworten