[PYTHON] 全局变量

应该尽可能避免使用全局变量。不一样的模块均可以自由的访问全局变量,可能会致使全局变量的不可预知性。对全局变量,若是程序员甲修改了_a的值,程序员乙同时也要使用_a,这时可能致使程序中的错误。这种错误是很难发现和更正的。 python

全局变量下降了函数或模块之间的通用性,不一样的函数或模块都要依赖于全局变量。一样,全局变量下降了代码的可读性,阅读者可能并不知道调用的某个变量是全局变量。程序员

可是某些时候,全局变量可以解决局部变量所难以解决的问题。事物要一分为二。app

python里面全局变量有两种灵活的用法:函数

1 声明法spa

在文件开头声明全局变量variable,.net

在具体函数中使用该变量时,须要事先声明 global variable,不然系统将该变量视为局部变量。blog

CONSTANT = 0  (将全局变量大写便于识别)

def modifyConstant() : 
        global CONSTANT 
        print CONSTANT 
        CONSTANT += 1 
        returnip

if __name__ == '__main__' : 
        modifyConstant() 
        print CONSTANTget

2模块法(推荐)input

把全局变量定义在一个单独的模块中:
#gl.py
gl_1 = 'hello'
gl_2 = 'world'

在其它模块中使用
#a.py
import gl

def hello_world()
    print gl.gl_1, gl.gl_2

#b.py
import gl

def fun1()
    gl.gl_1 = 'Hello'
    gl.gl_2 = 'World'

第二种方法,适用于不一样文件之间的变量共享,并且必定程度上避免了开头所说的全局变量的弊端,推荐!

 

Python两个内置函数——locals 和globals

locals 是只读的,globals 不是

这两个函数主要提供,基于字典的访问局部和全局变量的方式。
在理解这两个函数时,首先来理解一下python中的名字空间概念。Python使用叫作名字空间的
东西来记录变量的轨迹。名字空间只是一个字典,它的键字就是变量名,字典的值就是那些变
量的值。实际上,名字空间能够象Python的字典同样进行访问


每一个函数都有着自已的名字空间,叫作局部名字空间,它记录了函数的变量,包括函数的参数
和局部定义的变量。每一个模块拥有它自已的名字空间,叫作全局名字空间,它记录了模块的变
量,包括函数、类、其它导入的模块、模块级的变量和常量。还有就是内置名字空间,任何模
块都可访问它,它存放着内置的函数和异常。


当一行代码要使用变量 x 的值时,Python会到全部可用的名字空间去查找变量,按照以下顺序:


1.局部名字空间 - 特指当前函数或类的方法。若是函数定义了一个局部变量 x,Python将使用
  这个变量,而后中止搜索。
2.全局名字空间 - 特指当前的模块。若是模块定义了一个名为 x 的变量,函数或类,Python
  将使用这个变量而后中止搜索。
3.内置名字空间 - 对每一个模块都是全局的。做为最后的尝试,Python将假设 x 是内置函数或变量。


若是Python在这些名字空间找不到 x,它将放弃查找并引起一个 NameError 的异常,同时传递
There is no variable named 'x' 这样一条信息。


#局部变量函数locals例子(locals 返回一个名字/值对的字典。):

[python] view plain copy

 print?

  1. def foo(arg, a):  
  2.     x = 1  
  3.     y = 'xxxxxx'  
  4.     for i in range(10):  
  5.         j = 1  
  6.         k = i  
  7.     print locals()  
  8.   
  9.   
  10. #调用函数的打印结果    
  11. foo(1,2)  
  12. #{'a': 2, 'i': 9, 'k': 9, 'j': 1, 'arg': 1, 'y': 'xxxxxx', 'x': 1}  

一个globals的例子:

def set_global_table(table_name, data):
   
globals()[table_name] = data

def get_global_table(table_name):
    """
        get the content in the input table
    """
    try :
        print "table %s: %s" % (table_name,str(globals()[table_name]))
        return
globals()[table_name]
    except KeyError :
        print "No table named %s found" % table_name         return {}

相关文章
相关标签/搜索