Seite 1 von 1

Globale liste in function manipulieren

Verfasst: Dienstag 26. Juli 2022, 08:53
von Schurmalok
Hallo zusammen,

ich habe vor vielen Jahren Basic und Pascal programmiert und arbeite mich gerade in Python ein. Dabei bin ich auf ein Problem gestoßen. Ich habe zwei Listen außerhalb aller Funktionen deklariert, womit sie, wenn ich das richtig verstanden habe, global sind. Wenn ich den Inhalt dieser Listen in einer Funktion ändern will, werden sie offenbar immer als lokal betrachtet. Wie kann ich in einer Funktion auf die beiden globalen Listen zugreifen? Für einfache Datentypen funktioniert das prima mit "global", mit den Listen nicht. Was mache ich falsch?
Ich danke euch für eure Hilfe.

Re: Globale liste in function manipulieren

Verfasst: Dienstag 26. Juli 2022, 09:11
von Dennis89
Hallo,

eigentlich sollten nur Konstanten global verfügbar sein.
Bei änderlichen Objekten will man keinen globalen Zustand. Die Liste wird in einer Funktion erzeugt und wenn eine andere Funktion die Liste benötigt, dann wird sie beim Funktionsaufruf übergeben und je nach Anwendung mit 'return' wieder zurück gegeben.

Grüße
Dennis

Re: Globale liste in function manipulieren

Verfasst: Dienstag 26. Juli 2022, 09:14
von Schurmalok
Hallo Dennis,

ok, das hilft mir auch weiter. Dann mache ich das so.

Re: Globale liste in function manipulieren

Verfasst: Dienstag 26. Juli 2022, 10:37
von DeaD_EyE

Code: Alles auswählen

def add_test():
    # bei der Funktionsdefinition existiert meine_liste noch nicht
    # Zugegriffen wird erst, wenn die Funktion ausgeführt wird
    # zuerst wird in der Funktion nach meine_liste gesucht, aber nicht gefunden
    # dann wird auf Modulebene gesucht und gefunden.
    meine_liste.append("Test2")


# würde man hier schon add_test() aufrufen, käme es zu einem
# NameError. meine_liste existiert nicht

# definition auf Modulebene
meine_liste = ["Test"]

print(meine_liste)
add_test()
print(meine_liste)

Da nur auf die Methoden des Objektes `meine_liste` zugegriffen wird, braucht man global erst gar nicht zu verwenden.
Solche Konstruktionen führen aber oft zu Problemen. Normale Listen kann man auch einfach kopieren, anstatt sie zu modifizieren.
Die Funktion add_test ist auch schlecht gewählt, da sie Seiteneffekte hat. Es werden Objekte verändert, die noch nicht einmal den Argumenten der Funktion vorkommen.
Normalerweise erwartet man das nicht.

Re: Globale liste in function manipulieren

Verfasst: Dienstag 26. Juli 2022, 10:45
von __deets__
Seufz. Und ein Beispiel mehr im Internet, dessen Beipackzettel natuerlich ignoriert wird, und einfach dankend als "Loesung" verwendet wird.

Re: Globale liste in function manipulieren

Verfasst: Dienstag 26. Juli 2022, 11:31
von DeaD_EyE
__deets__ hat geschrieben: Dienstag 26. Juli 2022, 10:45 Seufz. Und ein Beispiel mehr im Internet, dessen Beipackzettel natuerlich ignoriert wird, und einfach dankend als "Loesung" verwendet wird.
Das ist aber nicht mein Problem und ich habe auch keinen Einfluss darauf, was andere machen bzw. nicht machen.
Des Weiteren lernen nur diejenigen, die Fehler machen. Jemand, der von Anfang an alles richtig macht, lernt nichts.

Aus der Praxis kenne ich ein paar Beispiele. Fehlersuche ist in vielen Bereichen wichtig und wird oftmals völlig falsch und unlogisch angegangen.
Das sollte man üben und man sollte auch üben, was passiert, wenn man alles das macht, wovon hier immer abgeraten wird.


Man kann z.B. Azubis versuchen zu erklären, was passiert, wenn man einen PID-Regler falsch einstellt. Das ist ziemlich langweilig.
Oder man zeigt ihnen anhand eines Modells, was in der Praxis passiert, wenn die Regelung anfängt zu schwingen.
Das geht natürlich nur mit kleinen Modellen, da eine große Anlage sich ziemlich schnell selbst zerstören würde.

Re: Globale liste in function manipulieren

Verfasst: Dienstag 26. Juli 2022, 12:54
von __deets__
Du widersprichst dir selbst. Entweder man kann durch schlechte Didaktik jemandem etwas nicht oder nicht so gut beibringen, dann hat man Einfluss darauf. So wie du das ja selbst schoen darstellst mit deinen Azubis. Oder man hat den nicht, dann musst du aber auch keine Zeit mit den Azubis fuer Experimente vergeuden. Was ist es nun?

Das du (oder ich) nicht *verbieten* koennen, was andere Leute machen, steht auf einem anderen Blatt, ist hier aber irrelevant.

Und dein Beispiel ist genau das, was du selbst als schlecht darstellst: nur zu erklaeren, anstatt zu illustrieren, wie man etwas falsch macht, es dabei aber gleichzeitig jemandem ohne Ahnung als Beispiel an die Hand zu geben. Das aequivalent zum PID-Regler waere ein Programm, dass durch globalen Zustand unwartbar ist. Das ist ja aber nicht der Fall, dafuer ist es viel zu klein.

Re: Globale liste in function manipulieren

Verfasst: Dienstag 26. Juli 2022, 13:01
von Schurmalok
Es ging doch eigentlich um meine Frage, ob man globale LIsten in einer Function manipulieren kann. Ich verstehe zwar nicht, warum das nicht geht / gehen soll, aber wenn es eine Möglichkeit gibt, damit umzugehen, bin ich zufrieden. Früher gab es lokale und globale Datenstrukturen, mit denen ich einmal gearbeitet habe. An die andere Arbeitsweise werde ich mich gewöhnen oder eben doch zu Pascal oder Basic zurückgehen, da es keine berufliche Relevanz hat. Ich programmiere nur aus Spaß an der Freude.

Re: Globale liste in function manipulieren

Verfasst: Dienstag 26. Juli 2022, 13:04
von __deets__
Natuerlich geht das. DeadEye hat dir einen Weg aufgezeigt. Benutz den. Dennis hat dir den besseren Weg gezeigt, weil man ohne globalen Zustand robusteren und verstaendlicheren Code schreibt.

Das Argument, das waere egal, weil man's ja nur zum Spass macht, ist quatsch. Man kann sich auch beim heimwerken einen Splitter ins Auge einfangen, und sollte darum eine Schutzbrille anziehen. Nicht nur auf Arbeit.

Re: Globale liste in function manipulieren

Verfasst: Dienstag 26. Juli 2022, 13:07
von Schurmalok
Fein, danke. Wenn es einen guten Weg gibt, dann will ich ihn auch gerne benutzen. Ich wll ja keinen Splitter im Auge... ;-) Danke.