Ik weet dat ik het gebruik van globale variabelen in de eerste plaats moet vermijden omwille van verwarring zoals deze, maar als ik ze toch zou gebruiken, is het volgende dan een geldige manier om ze te gebruiken? (Ik probeer de globale kopie van een variabele aan te roepen die in een aparte functie is aangemaakt).
x = "somevalue"
def func_A ():
global x
# Do things to x
return x
def func_B():
x=func_A()
# Do things
return x
func_A()
func_B()
Heeft de 'x' die de tweede functie gebruikt dezelfde waarde van de globale kopie van 'x' die 'func_a' gebruikt en wijzigt? Maakt de volgorde bij het aanroepen van de functies na de definitie uit?
Als je een globale variabele wilt benaderen, gebruik je gewoon de naam. Maar om **de waarde ervan te veranderen moet je het global
sleutelwoord gebruiken.
Bijv.
global someVar
someVar = 55
Dit zou de waarde van de globale variabele veranderen in 55. Anders zou het gewoon 55 toewijzen aan een lokale variabele.
De volgorde van de lijsten met functiedefinities doet er niet toe (aangenomen dat ze niet op een of andere manier naar elkaar verwijzen), de volgorde waarin ze worden aangeroepen wel.
Zoals anderen al hebben opgemerkt, moet je een variabele global
verklaren in een functie als je wilt dat die functie de globale variabele kan wijzigen. Als je er alleen toegang toe wilt hebben, dan heb je global
niet nodig.
Om daar wat dieper op in te gaan, wat "modify" betekent is dit: als je de globale naam wilt re-binden zodat het naar een ander object wijst, dan moet de naam global
verklaard worden in de functie.
Veel bewerkingen die een object wijzigen (muteren) binden de globale naam niet opnieuw zodat deze naar een ander object wijst, en dus zijn ze allemaal geldig zonder de naam globaal
in de functie te declareren.
d = {}
l = []
o = type("object", (object,), {})()
def valid(): # these are all valid without declaring any names global!
d[0] = 1 # changes what's in d, but d still points to the same object
d[0] += 1 # ditto
d.clear() # ditto! d is now empty but it`s still the same object!
l.append(0) # l is still the same list but has an additional member
o.test = 1 # creating new attribute on o, but o is still the same object
U moet de global
declaratie gebruiken als u de waarde van een globale variabele wilt veranderen.
Je hebt het niet nodig om van een globale variabele te lezen. Merk op dat het aanroepen van een methode op een object (zelfs als het de gegevens in dat object verandert) niet de waarde van de variabele verandert die dat object bevat (zonder reflecterende magie).