Seite 1 von 1

Python: Wo muss global stehen?

Verfasst: Dienstag 17. Juli 2018, 14:18
von magifix
Hallo,

ich benötige eine Variable in mehreren Unterprogrammen
kann mir jemand bitte sagen wo man global variable einsetzen muss?

Re: Python: Wo muss global stehen?

Verfasst: Dienstag 17. Juli 2018, 14:22
von __blackjack__
@magifix: Nirgends. Vergiss ``global``. Übergib den Wert beim Aufrufen der Funktionen.

Re: Python: Wo muss global stehen?

Verfasst: Dienstag 17. Juli 2018, 17:31
von magifix
Danke für deine Antwort
Hat mir so leider nicht weitergeholfen weil mein Problem etwas anders gelagert ist
ich habe eine Variable die die Werte 0,1,2 oder 3 haben kann.
Die muss ich abfragen
Dann bekomme ich aber beim Starten die Meldung ... referenced befor assignment
ich müsste es also irgendwie schaffen die Variable zu setzen wenn sie noch nicht gesetzt ist

Re: Python: Wo muss global stehen?

Verfasst: Dienstag 17. Juli 2018, 18:42
von sls
Zeige am besten deinen Code (bitte hier in Python-Code-Tags formatieren) - man kann sich eher schwer vorstellen was genau du machen willst bzw. wo es zum Problem kommt. Auch besagte Fehlermeldung kann verschiedenste Gründe haben, z.B. wenn die Variablen-Deklaration *sein kann* aber nicht *sein muss* - Beispiel: if-else, try-except usw.

Re: Python: Wo muss global stehen?

Verfasst: Dienstag 17. Juli 2018, 20:03
von magifix

Code: Alles auswählen


def zeichnen()
	if col==0:
		farbe="rot"
	if col==1:
		farbe="grün"
	if col==2:
		farbe="blau"
	col=col+1
	if col==3:
		col=0
Habe den Code auf das Wichtige gekürzt
Diese Routine wird nach einer Messung jeweils aufgerufen.
beim ersten Aufruf müsse col = 0 sein
beim erneuten Aufruf soll die letzte Zahl noch da sein

Re: Python: Wo muss global stehen?

Verfasst: Dienstag 17. Juli 2018, 21:33
von DeaD_EyE
global muss vor der ersten Zuweisung erfolgen.
Ich glaube da gab es diesbezüglich noch einen Bugfix in der letzten oder vorletzten Python Version.

Code: Alles auswählen

var = 10

def test():
    global var
    var = 11
So könnte man das Problem anders lösen:

Code: Alles auswählen

class Test:
    def __init__(self, var):
        self.var = var
    def count(self):
        self.var +=1

test = Test(43)
print(test.var)
test.count()
print(test.var)
Oder halt die Logik in einzelne Funktionen auslagern, Rückgabewerte liefern (return) und diese in einer anderen Funktion weiter verarbeiten.
Egal was du machst, alles ist besser als global. Mach den Fehler ein paar mal und du wirst global meiden wie die Katze das Wasser.

Re: Python: Wo muss global stehen?

Verfasst: Dienstag 17. Juli 2018, 22:27
von __blackjack__
@magifix: Da braucht man keine globale Variable, das übergibt man einfach als Argument und gibt den veränderten Wert zum Aufrufer zurück, damit der den beim nächsten Aufruf wieder übergeben kann. Wenn man `col` dann vernünftig benennt, könnte das so aussehen:

Code: Alles auswählen

def zeichnen(color_id):
    if color_id == 0:
        farbe = 'rot'
    elif color_id == 1:
        farbe = 'grün'
    elif color_id == 2:
        farbe = 'blau'
    else:
        assert False, 'invalid color_id {}'.format(color_id)
    return (color_id + 1) % 3
Diese Indirektion über eine Zahl ist an sich aber schon unschön. Wenn Du durch Werte zyklisch iterieren möchtest, dann gibt es dafür `itertools.cycle()`:

Code: Alles auswählen

In [1]: from itertools import cycle

In [2]: colors = cycle(['red', 'green', 'blue'])

In [3]: next(colors)
Out[3]: 'red'

In [4]: next(colors)
Out[4]: 'green'

In [5]: next(colors)
Out[5]: 'blue'

In [6]: next(colors)
Out[6]: 'red'

In [7]: next(colors)
Out[7]: 'green'

In [8]: next(colors)
Out[8]: 'blue'

In [9]: next(colors)
Out[9]: 'red'
Das kann man dann der Funktion beim Aufruf übergeben und die schrumpft zu:

Code: Alles auswählen

def zeichnen(colors):
    farbe = next(colors)

Re: Python: Wo muss global stehen?

Verfasst: Mittwoch 18. Juli 2018, 13:10
von magifix
Hallo Blackjack und Dead-eye,

vielen Dank für eure Hilfe
das war ja ein echter Lehrgang
nun hab ich damit hinbekommen!!!
DANKE!