Python基础教程之内置函数locals()和globals()用法分析
本文实例讲述了Python基础教程之内置函数locals()和globals()用法。分享给大家供大家参考,具体如下:
1.这两个函数主要提供,基于字典的访问局部变量和全局变量的方式。
python使用叫做名字空间的东西来记录变量的轨迹。名字空间是一个字典,它的键就是字符串形式的变量名字,它的值就是变量的实际值。
名字空间可以像Python的dictionary一样进行访问。
在一个Python程序中的任何一个地方,都存在几个可用的名字空间。
每个函数都有着自已的名字空间,叫做局部名字空间,它记录了函数的变量,包括函数的参数和局部定义的变量。
每个模块拥有它自已的名字空间,叫做全局名字空间,它记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。
还有就是内置名字空间,任何模块均可访问它,它存放着内置的函数和异常。
2.当一行代码要使用变量x的值时,Python会到所有可用的名字空间去查找变量,按照如下顺序:
局部名字空间-特指当前函数或类的方法。如果函数定义了一个局部变量x,或一个参数x,Python将使用它,然后停止搜索。
全局名字空间-特指当前的模块。如果模块定义了一个名为x的变量,函数或类,Python将使用它然后停止搜索。
内置名字空间-对每个模块都是全局的。作为最后的尝试,Python将假设x是内置函数或变量。
如果Python在这些名字空间找不到x,它将放弃查找并引发一个NameError异常,同时传递Thereisnovariablenamed'x'这样一条信息.
3.名字空间在运行时直接可以访问。局部名字空间可以通过内置的locals函数来访问。全局(模块级别)名字空间可以通过内置的globals函数来访问。
locals对局部(函数)名字空间做了些什么,globals就对全局(模块)名字空间做了什么。
然而globals更令人兴奋,因为一个模块的名字空间包含了模块级的变量和常量,它还包括了所有在模块中定义的函数和类,以及任何被导入到模块中的东西。
4.回想一下frommoduleimport和importmodule之间的不同?
使用importmodule,模块自身被导入,但是它保持着自已的名字空间,这就是为什么您需要使用模块名来访问它的函数或属性:module.function的原因。
但是使用frommoduleimport,实际上是从另一个模块中将指定的函数和属性导入到您自己的名字空间,这就是为什么您可以直接访问它们却不需要引用它们所来源的模块的原因。
使用globals函数,您会真切地看到这一切的发生。
5.locals()实例:
deffoo(arg,a): x=100 y='hellopython!' foriinrange(10): j=1 k=i printlocals() foo(1,2)
结果:
{'a':2,'i':9,'k':9,'j':1,'arg':1,'y':'hellopython!','x':100}
6.locals是只读的,不可修改,而globals可以修改,原因是:
locals()实际上没有返回局部名字空间,它返回的是一个拷贝。所以对它进行修改,修改的是拷贝,而对实际的局部名字空间中的变量值并无影响。
globals()返回的是实际的全局名字空间,而不是一个拷贝:与locals的行为完全相反。
所以对globals所返回的dictionary的任何的改动都会直接影响到全局变量的取值。
#!/usr/bin/envpython #coding:utf-8 '''''Thisismyfirstpythonprogram!''' z=7#定义全局变量 deffoo(arg): x=1 printlocals() print'x=',x locals()['x']=2#修改的是局部名字空间的拷贝,而实际的局部名字空间中的变量值并无影响。 printlocals() print"x=",x foo(3) printglobals() print'z=',z globals()["z"]=8#globals()返回的是实际的全局名字空间,修改变量z的值 printglobals() print"z=",z
结果:
{'x':1,'arg':3} x=1 {'x':1,'arg':3} x=1 {'foo':,'__builtins__': ,'__file__':'E:\\workspace\\pythonday03\\main\\test.py','__package__':None,'__name__':'__main__','z':7,'__doc__':'Thisismyfirstpythonprogram!'} z=7 {'foo': ,'__builtins__': ,'__file__':'E:\\workspace\\pythonday03\\main\\test.py','__package__':None,'__name__':'__main__','z':8,'__doc__':'Thisismyfirstpythonprogram!'} z=8
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python函数使用技巧总结》、《Python数据结构与算法教程》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。