Python: Wo muss global stehen?

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
magifix
User
Beiträge: 29
Registriert: Samstag 20. Januar 2018, 16:45

Hallo,

ich benötige eine Variable in mehreren Unterprogrammen
kann mir jemand bitte sagen wo man global variable einsetzen muss?
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@magifix: Nirgends. Vergiss ``global``. Übergib den Wert beim Aufrufen der Funktionen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
magifix
User
Beiträge: 29
Registriert: Samstag 20. Januar 2018, 16:45

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
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

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.
When we say computer, we mean the electronic computer.
magifix
User
Beiträge: 29
Registriert: Samstag 20. Januar 2018, 16:45

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
Benutzeravatar
DeaD_EyE
User
Beiträge: 1012
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

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.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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)
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
magifix
User
Beiträge: 29
Registriert: Samstag 20. Januar 2018, 16:45

Hallo Blackjack und Dead-eye,

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