Python的locals和globals函数

python的locals和globals函数

这两个函数主要提供基于字典的访问局部和全局变量的方式。首先说一下命名空间的解释。

Python使用名字空间来记录变量的轨迹,名字空间是一个字典,键是变量名,值是变量值。

任何一个Python程序都存在几个名字空间:

  1. 局部命名空间
    每个函数的空间就是局部命名空间,它记录了函数的变量,包括函数参数和局部定义的变量;

  2. 全局命名空间
    每个模块定义拥有的空间,它定义了模块级的变量和常量,函数,类,还有导入的模块。

  3. 内置名字空间
    存储Python内置的函数和异常

当一行代码使用变量a时,Python会到这几个命名空间去查找变量,查找顺序如下:

1.局部名字空间;如果局部函数中定义了变量x,那么就用这个变量,然后停止搜索;
2.全局命名名字空间, 如果没有在局部空间找到,就搜索模块中的变量,如果模块中定义了变量a,就使用它,然后停止搜索,
3.内置名字空间; 最后会搜索内置的函数或变量a.

如果上面三个地方都没有找到a,那么Python会抛出NameError异常。

说完名字空间,再说这两个内置函数。 直接拿例子来说:

def test_locals(*args):
x = 1
print locals()



if __name__ == "__main__":
    y=1
    print '*****locals()*****'
    test_locals(1,2)
    print '******globals()****'
    print globals()
    for key,value in globals().items():
         print key,value


输出:

*****locals()*****
{'x': 1, 'args': (1, 2)}
******globals()****
{'__builtins__': <module '__builtin__' (built-in)>, '__file__': 'C:\\Python27\\ez_setup.py', 'test_locals': <function test_locals at 0x0000000002676908>, '__package__': None,'y': 1, '__name__': '__main__', '__doc__': None}

看globals返回的字典,不仅有变量,含有函数,以及一些内置的变量;locals()只返回函数的参数和自定义的变量。

locals()和globals还有一个区别是locals是只读的,globals不是。例子:

   def test_locals(*args):
        x = 1
        locals()['x'] = 2
        print 'x=',x
        print locals()



if __name__ == "__main__":
    y = 1
    print '*****locals()*****'
    test_locals(1,2)
    print '******globals()****'
    globals()['y'] = 2
    print globals()

    输出:
    x= 1
    {'x': 1, 'args': (1, 2)}
    ******globals()****
    {'__builtins__': <module '__builtin__' (built-in)>, '__file__': 'C:\\Python27\\ez_setup.py', 'test_locals': <function test_locals at 0x0000000002E9EF98>, '__package__': None, 'y': 2, '__name__': '__main__', '__doc__': None}
--------EOF---------
微信分享/微信扫码阅读