我知道我应该首先避免使用全局变量,因为像这样的混乱,但如果我要使用它们,下面是一个有效的方式去使用它们吗?(我正在尝试调用在单独函数中创建的变量的全局副本。)

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的全局副本具有相同的值?在定义之后调用函数时,顺序重要吗?


当前回答

如果你只是想访问一个全局变量,你只需要使用它的名字。然而,要改变它的值,你需要使用全局关键字。

E.g.

global someVar
someVar = 55

这将把全局变量的值更改为55。否则它只会把55赋值给一个局部变量。

函数定义清单的顺序并不重要(假设它们不以某种方式相互引用),调用它们的顺序才重要。

其他回答

如果你只是想访问一个全局变量,你只需要使用它的名字。然而,要改变它的值,你需要使用全局关键字。

E.g.

global someVar
someVar = 55

这将把全局变量的值更改为55。否则它只会把55赋值给一个局部变量。

函数定义清单的顺序并不重要(假设它们不以某种方式相互引用),调用它们的顺序才重要。

当您希望更改分配给全局变量的值时,必须使用全局声明。

你不需要它来读取全局变量。注意,调用对象上的方法(即使它改变了该对象中的数据)不会改变持有该对象的变量的值(没有反射魔法)。

正如其他人所注意到的,当您希望函数能够修改全局变量时,您需要在函数中声明一个变量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

您可以直接访问函数中的全局变量。如果你想改变全局变量的值,使用"global variable_name"。示例如下:

var = 1
def global_var_change():
      global var
      var = "value changed"
global_var_change() #call the function for changes
print var

一般来说,这不是一个好的编程实践。通过破坏名称空间逻辑,代码可能变得难以理解和调试。

这里有一个例子让我发现,使用全局变量作为参数的默认值。

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