命名空间局部python命名空间与作用域 命名空间局部

本篇文章笔者在广东吃饭的时候突然想到的...这段时间就有想写几篇关于命名空间局部的笔记,所以回家到后之就奋笔疾书的写出来发布了

    命名空间是名称与对象之间的系关,可以将命名空间看作是字典,其中的键是名称,值是对象。

    命名空间不同享名称。

    在命名空间中的名称能将任何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则规是先查检局部命名空间,后之是闭封在局部命名空间中的其他数函,后之是全局命名空间,在最后以置内命名空间结束。

文章结束给大家分享下程序员的一些笑话语录: 自行车
一个程序员骑着一个很漂亮的自行车到了公司,另一个程序员看到了他,问 到,“你是从哪搞到的这么漂亮的车的?”
骑车的那个程序员说, “我刚从那边过来, 有一个漂亮的姑娘骑着这个车过来, 并停在我跟前,把衣服全脱了,然后对我说,‘你想要什么都可以’”。
另一个程序员马上说到, “你绝对做了一个正确的选择, 因为那姑娘的衣服你 并不一定穿得了”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值