本篇文章笔者在广东吃饭的时候突然想到的...这段时间就有想写几篇关于命名空间局部的笔记,所以回家到后之就奋笔疾书的写出来发布了
命名空间是名称与对象之间的系关,可以将命名空间看作是字典,其中的键是名称,值是对象。
命名空间不同享名称。
在命名空间中的名称能将任何python对象作为值,在不同的命名空间中雷同的名称可以与不同的对象相关联。但是,如果存在名称剖析议协,则多个命名空间可以起一任务来剖析名称。也就是说,如果有多个命名空间(是总有的),那么可以定义搜索的次序,顺次在不同的命名空间里来找查某个名称(或确认其不存在于任何可认的命名空间)。在python中,将这一程过定义为作用域。
作用域搜索则规:LEGB
L:局部的(local)
E:闭封的(Enclosing)
G:全局的(Global)
B:置内的(Built-in)
一、局部命名空间
数函外部的命名空间,在调用数函的时候生成,调用结束时失消。当局部命名空间有效时,它是第一个于用查检某个名字存在性的命名空间。如果在局部命名空间内找到该名称,则回返与名字相关联的对象,反之示提犯错。
二、全局命名空间
python在模块中维护命名空间,模块是一些python件文--含包数函等对象,并且可以入导其他程序应用。当某个模块被入导后之,该模块同时引入了一个命名空间,其中含包模块中有所的名称和关联的对象,可以通过存储在没个模块中的__dict__来查看这个命名空间,换句话说,字典就是这个模块的命名空间。
如果想要引用给模块中的对象,要应用点符号将名称和模块名称关联,这际实上是要求将对象与该模块中的名称相关联。
当python动启解释器时,它将主动入导两个模块,即模块__main__和__built-ins__。__main__模块是默许的全局模块,有所新对象都存储在其中。可以通过数函globals来访问该命名空间的字典。子啊平python解释器中通过输入用户交互时,globals是有效的命名空间。
1.局部值赋则规
python中有一种称为“地本值赋”的则规非常趣有。如果在数函内的任何地方停止局部值赋,则该值赋只在前当活动的命名空间中创立名称。时有这将生发用作副,举例如下:
>>> value = 27
>>> def func(param1,param2):
for key,val in locals().items():
print (key,val)
value = value + 1
>>> func(98765,43210)
param1 98765
param2 43210
Traceback (most recent call last):
File " <pyshell#7> " , line 1, in <module>
func( 98765,43210)
File " <pyshell#6> " , line 4, in func
value = value + 1
UnboundLocalError: local variable ' value ' referenced before assignment
>>>
首先通过值赋在全局命名空间中创立了变量value。许也你会为认,当数函值加1是会先在局部的命名空间中找查变量,没法找到时在全局命名空间中找到该名字。可以并非这样。
python提出如下假设,如果在数函体内的任何地方对变量值赋,则python将名称添加到局部命名空间中。语句value=value+1对对象value停止值赋。python假设无论在何处生发值赋,value都是数函func局部命名空间的一部分。当python实验把1跟value相加时,该value名称在局部命名空间中,但它没有关联值,所以python报错。
问题在于python何时决定使value出现在局部命名空间中。际实value出现在局部命名空间中生发在代码运行前,即,在python运行到数函定义之前。由于创立命名空间时,python会查检代码并充填局部命名空间。在python运行那行代码之前,就发现了对value的值赋,并把它添加到局部命名空间中,当数函执行时,python解释器为认value在局部命名空间中但没有值,所以会生发错误。
2.global语句
有一个方法可以处理下面的问题。如果在数函体内,应用global语句将变量声明为全局变量,那么python不会为该变量在命名空间中创立局部名称。
三、置内模块
循遵LEGB搜索则规,如果python不能在局部命名空间中找到某个名称,则会在全局命名空间中继承寻觅,它寻觅到的将是python的置内名称。
built-in模块和其他模块一样,都有具__dict__性属,这就是模块的命名空间
四、闭封式变量
“闭封式”的作用域则规适应于数函定义数函时,也就是说,在数函体内定义了一个新的数函。这个数函体内的数函是外数函的局部命名空间中的一部分,意味着只有在外数函执行期间才能够运行。整完的LEGB则规是先查检局部命名空间,后之是闭封在局部命名空间中的其他数函,后之是全局命名空间,在最后以置内命名空间结束。
文章结束给大家分享下程序员的一些笑话语录: 自行车
一个程序员骑着一个很漂亮的自行车到了公司,另一个程序员看到了他,问 到,“你是从哪搞到的这么漂亮的车的?”
骑车的那个程序员说, “我刚从那边过来, 有一个漂亮的姑娘骑着这个车过来, 并停在我跟前,把衣服全脱了,然后对我说,‘你想要什么都可以’”。
另一个程序员马上说到, “你绝对做了一个正确的选择, 因为那姑娘的衣服你 并不一定穿得了”。
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com