Python中变量作用域特有的问题 – 全局变量

变量在使用之前未定义

由于python变量的动态性,变量在赋值时会自动定义。
与其它语言一样,全局变量在函数中可直接使用,不需特意声明。然而在函数中对一与全局变量同名的变量赋值时,默认创建的,却是一局部变量。这在某些情况上,会使python解析器都出现一些困扰。

a = 123
def function_test():
    print a
    a = 456
    print a
function_test()

这段代码会报(变量在使用之前未定义)的错误。
若去掉a=456一句,则程序运行正常。
若去掉print a一句,程序运行也正常。
但两句共存,则报错。
原因即在于 print a 自动适用LEGB法则,将a作为全局变量解释,但其之后的a=456却根据原则,重新定义了一个a的局部变量。显然,在function_test函数的同一作用域内,a不可能既为全局又为局部,所以a将作为局部变量来定义。那么位于a=456之前的print a一句,将访问的是一个还不存在的局部变量a,当然会出错。
而根据本人的原意,是要打印和修改全局变量a1的值,所以解决方法是在print a1前面加上一句:global a1
将a1明确声明为全局变量。

a = 123
def function_test():
    global a
    print a
    a = 456
    print a
function_test()

运行结果是:
123
456
 

Global关键字

在Python中使用全局变量,其实,个人认为并不是很明智的选择;但是自己还是坚信,存在便合理,在于你怎么使用;全局变量降低了模块和函数之间的通用性;所以,在以后的编程过程中,应尽量避免使用全局变量。
全局变量的使用:
方法一:
为了便于代码管理,将全局变量统一放到一个模块中,然后在使用全局变量的时候,导入全局变量模块,通过这种方法来进行使用全局变量;
在一个模块中定义全局变量:

  1. #global.py
  2. GLOBAL_1 = 1
  3. GLOBAL_2 = 2
  4. GLOBAL_3 = ‘Hello World’

然后在一个模块中导入全局变量定义模块,在新模块中使用全局变量:

  1. import globalValues
  2. def printGlobal():
  3.     print(globalValues.GLOBAL_1)
  4.     print(globalValues.GLOBAL_3)
  5.     globalValues.GLOBAL_2 += 1 # modify values
  6. if __name__ == ‘__main__’:
  7.     printGlobal()
  8.     print(globalValues.GLOBAL_2)

 
方法二:
直接在模块中定义全局变量,然后在函数中直接使用就ok了。但是在使用全局变量的时候,必须在函数中使用global关键字进行标识:

  1. CONSTANT = 0
  2. def modifyGlobal():
  3.     global CONSTANT
  4.     print(CONSTANT)
  5.     CONSTANT += 1
  6. if __name__ == ‘__main__’:
  7.     modifyGlobal()
  8.     print(CONSTANT)

Leave a Reply