Python的locals和globals函数
python的locals和globals函数
这两个函数主要提供基于字典的访问局部和全局变量的方式。首先说一下命名空间的解释。
Python使用名字空间来记录变量的轨迹,名字空间是一个字典,键是变量名,值是变量值。
任何一个Python程序都存在几个名字空间:
-
局部命名空间
每个函数的空间就是局部命名空间,它记录了函数的变量,包括函数参数和局部定义的变量; -
全局命名空间
每个模块定义拥有的空间,它定义了模块级的变量和常量,函数,类,还有导入的模块。 -
内置名字空间
存储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---------
微信分享/微信扫码阅读
微信分享/微信扫码阅读