Знам, че трябва да избягвам използването на глобални променливи поради подобни обърквания, но ако все пак ги използвам, валиден ли е следният начин за използването им? (Опитвам се да извикам глобалното копие на променлива, създадена в отделна функция.)
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()
Дали 'x', която втората функция използва, има същата стойност на глобалното копие на 'x', което 'func_a' използва и променя? При извикване на функциите след дефиниция има ли значение редът?
Ако искате просто да получите достъп до глобална променлива, просто използвайте нейното име. За да промените нейната стойност обаче, трябва да използвате ключовата дума global
.
Напр.
global someVar
someVar = 55
Това ще промени стойността на глобалната променлива на 55. В противен случай просто ще присвои 55 на локалната променлива.
Редът на изписване на дефинициите на функциите няма значение (ако приемем, че те не се позовават една на друга по някакъв начин), има значение редът, в който се извикват.
Както вече отбелязаха други, трябва да декларирате променлива глобална
в дадена функция, когато искате тази функция да може да променя глобалната променлива. Ако искате само да имате достъп до нея, тогава не ви е необходима global
.
За да навлезем малко по-подробно в тази тема, това, което означава "модифициране", е следното: ако искате да превърнете глобалното име, така че то да сочи към друг обект, името трябва да бъде декларирано като global
във функцията.
Много операции, които модифицират (мутират) даден обект, не свързват отново глобалното име, така че да сочи към друг обект, и затова те са всички валидни, без да се декларира името global
във функцията.
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
Трябва да използвате декларацията global
, когато искате да промените стойността, присвоена на глобална променлива.
Тя не е необходима, за да четете от глобална променлива. Обърнете внимание, че извикването на метод върху обект (дори и да променя данните в този обект) не променя стойността на променливата, която държи този обект (ако няма отразяваща магия).