"global" wann wie und überhaupt??

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
iceman21
User
Beiträge: 41
Registriert: Sonntag 25. März 2007, 20:45
Kontaktdaten:

Mittwoch 20. Juni 2007, 21:49

hi

ich habe ein kleines spiel in cgi programmiert. Jetzt lese ich in einer funktion die daten der letzten runde ein... muss ich die jetzt alle "globalisieren"... also
jede variable

Code: Alles auswählen

global var1
global var2
global var3
oder sollte ich das anders machen... und vor allem wann muss ich die globaln? am anfang der scripts oder erst vorm zuweisen oder danach?

oder ihr habt ne gute seite wo das mit dem global-befeht ordentlich erklärt wird :)
MfG
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Mittwoch 20. Juni 2007, 22:28

Pythonprogrammierer sind in der Regel Globalisierungsgegner :wink:

Ja, du solltest es anders machen, aber ohne Code können wir dir nicht so wirklich gute Tipps geben.

Übrigens brauchst du global nur, wenn du der Variable etwas zuweisen willst, lesen geht auch ohne (grob gesprochen)
Benutzeravatar
Michael Schneider
User
Beiträge: 567
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Mittwoch 20. Juni 2007, 22:58

Hi Iceman!
iceman21 hat geschrieben:oder sollte ich das anders machen... und vor allem wann muss ich die globaln? am anfang der scripts oder erst vorm zuweisen oder danach?
Ich möchte mich meinem Vorredner anschließen. Ich kenne keine Situation, wo man wirklich globaln muss. Python bietet eine einzigartige Fülle an Datentypen und -strukturen, die geeignet sind, um mit einem Funktionsparameter alle relevanten Daten zu übergeben. Erzeuge doch ein Objekt Spiel, das Du dann an das neue Spiel übergeben kannst.

Grüße,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Mittwoch 20. Juni 2007, 23:01

iceman21 hat geschrieben: oder ihr habt ne gute seite wo das mit dem global-befeht ordentlich erklärt wird
[wiki]Die global-Anweisung[/wiki]

MaW: Versuch einfach, ohne auszukommen. Macht den Code schöner!
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
iceman21
User
Beiträge: 41
Registriert: Sonntag 25. März 2007, 20:45
Kontaktdaten:

Samstag 23. Juni 2007, 14:49

danke für eure antworten ... habe da leider immernoch ein kleines problem

eine variable wird in einer funktion geändert (jetzt vereinfacht):

Code: Alles auswählen

def mach(l):
    l=[2,3,4]

l=[1,2,3,4,5,6,7,8,9,0]
print l
mach(l)
print l
bei der ausgabe kommt so 2 mal [1,2,3,4,5,6,7,8,9,0] raus

wenn ich das aber so schreibe.... mit global funktionierts:

Code: Alles auswählen

def mach():
    global l
    l=[2,3,4]

l=[1,2,3,4,5,6,7,8,9,0]
print l
mach()
print l
ausgabe:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
[2, 3, 4]

mache ich da noch was falsch ? oder muss ich da global verwenden?
BlackJack

Samstag 23. Juni 2007, 15:03

In Deiner Funktion änderst Du kein Objekt, sondern bindest den Namen an ein komplett anderes Objekt.

Code: Alles auswählen

def mach():
    return [2, 3, 4]

liste = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
print liste
liste = mach()
print liste
iceman21
User
Beiträge: 41
Registriert: Sonntag 25. März 2007, 20:45
Kontaktdaten:

Samstag 23. Juni 2007, 15:32

hey danke das wars!!

aber wofür sind dann die parameter? also wo ist der unterschied zwischen:

def mach(l):
und
def mach():
BlackJack

Samstag 23. Juni 2007, 16:12

Parameter oder Argumente sind dazu da um Werte in eine Funktion "hinein zu geben" die "drinnen" gebraucht werden. Wenn man nichts braucht, braucht man nichts reingeben, genauso wie man bei Funktionen die nur einen Seiteneffekt haben, auch nicht (explizit) etwas zurückgeben muss.
iceman21
User
Beiträge: 41
Registriert: Sonntag 25. März 2007, 20:45
Kontaktdaten:

Samstag 23. Juni 2007, 16:22

hmm aber wenn man sich das hier mal anschaut:

Code: Alles auswählen

def load():
    return x+x
x=5
print x
load()
print x
dort wird "x" in der funktion doch gebraucht oder nicht? und es funktioniert trotzdem .... oder hab cih da was falsch verstanden? könntet ihr mal ein beispiel schreiben wo man einen parameter übergeben müsste ? vielen Dank
BlackJack

Samstag 23. Juni 2007, 16:40

Man müsste auch dort, wenn man sauber Programmieren will. Normalerweise steht das Programm ja nicht einfach so auf Modulebene sondern man teilt es sinnvoll in Funktionen auf.

Code: Alles auswählen

def double(n):
    return n + n

def main():
    x = 5
    print x
    x = double(x)
    print x

if __name__ == '__main__':
    main()
Hier muss man das Objekt übergeben, weil es keinen globalen Namen `n` gibt.
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Samstag 23. Juni 2007, 16:47

iceman21 hat geschrieben:dort wird "x" in der funktion doch gebraucht oder nicht? und es funktioniert trotzdem ....
In dem Beispiel existiert x nicht im lokalen Namensraum der Funktion, also wird im höherliegenden Namensraum nachgeschaut und x dort gefunden.
Wenn du nun x definiert, existiert ein (neues) x im Namensraum der Funktion und es wird danach immer das genommen.
global dient dazu zu sagen, dass du immer das globale x meinst und nicht ein neues anlegen willst.
iceman21
User
Beiträge: 41
Registriert: Sonntag 25. März 2007, 20:45
Kontaktdaten:

Samstag 23. Juni 2007, 19:15

hey vielen dank jetzt hab ich es verstanden :)
Vielen dank für eure hilfe!!
Benutzeravatar
Michael Schneider
User
Beiträge: 567
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Samstag 23. Juni 2007, 19:29

Hallo Iceman!
iceman21 hat geschrieben:danke für eure antworten ... habe da leider immernoch ein kleines problem

eine variable wird in einer funktion geändert (jetzt vereinfacht):

Code: Alles auswählen

def mach(l):
    l=[2,3,4]

l=[1,2,3,4,5,6,7,8,9,0]
print l
mach(l)
print l
bei der ausgabe kommt so 2 mal [1,2,3,4,5,6,7,8,9,0] raus
Wie Blackjack schon sagte, weist Du dem lokalen Namen l nur eine neue Liste zu, die als Teilliste aus l gebildet würde. Du kannst die Liste aber auch ändern:

Code: Alles auswählen

def mach(l):
    l[2:5]=[0, 0]

l=[1,2,3,4,5,6,7,8,9,0]
print l
mach(l)
print l
Du kannst einen Ausschnitt (Slice) der Liste durch eine andere Liste ersetzen - hier die Elemente 2, 3 und 4 durch 0, 0.
iceman21 hat geschrieben:def load():
return x+x
x=5
print x
load()
print x
Das erscheint mir völlig sinnfrei. Du gibst zwar den doppelten Wert von x zurück, das ändert aber weder den Namen noch den Inhalt von x, noch wird es während einer Skriptausführung ausgegeben. Wenn Du in der Funktion den Ausdruck "x=x+x" verwenden würdest, dann würdest Du eine NameError Exception verursachen, da dann nicht mehr im äußeren Namensraum nach x gesucht wird (weil Du diesem Namen ein neues Objekt zuweist - Eigenart von Python).

Grüße,
Michel
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Antworten