我知道我应该首先避免使用全局变量,因为像这样的混乱,但如果我要使用它们,下面是一个有效的方式去使用它们吗?(我正在尝试调用在单独函数中创建的变量的全局副本。)
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是否与func_a使用并修改的x的全局副本具有相同的值?在定义之后调用函数时,顺序重要吗?
正如其他人所注意到的,当您希望函数能够修改全局变量时,您需要在函数中声明一个变量global。如果你只想访问它,那么你不需要全局。
更详细地说,“modify”的意思是:如果你想重新绑定全局名称,使它指向一个不同的对象,这个名称必须在函数中声明为全局的。
许多修改(突变)对象的操作不会重新绑定全局名称以指向不同的对象,因此它们都是有效的,而无需在函数中声明全局名称。
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
这里有一个例子让我发现,使用全局变量作为参数的默认值。
globVar = None # initialize value of global variable
def func(param = globVar): # use globVar as default value for param
print 'param =', param, 'globVar =', globVar # display values
def test():
global globVar
globVar = 42 # change value of global
func()
test()
=========
output: param = None, globVar = 42
我期望param的值为42。惊喜。Python 2.7在第一次解析函数func时计算globVar的值。改变globVar的值并不影响分配给param的默认值。延迟评估,如下所示,正如我所需要的那样。
def func(param = eval('globVar')): # this seems to work
print 'param =', param, 'globVar =', globVar # display values
或者,如果你想安全起见,
def func(param = None)):
if param == None:
param = globVar
print 'param =', param, 'globVar =', globVar # display values