本篇文章笔者在广东吃饭的时候突然想到的...这段时间就有想写几篇关于命名空间局部的笔记,所以回家到后之就奋笔疾书的写出来发布了
命名空间是名称与对象之间的系关,可以将命名空间看作是字典,其中的键是名称,值是对象。
命名空间不同享名称。
在命名空间中的名称能将任何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则规是先查检局部命名空间,后之是闭封在局部命名空间中的其他数函,后之是全局命名空间,在最后以置内命名空间结束。
文章结束给大家分享下程序员的一些笑话语录: 自行车
一个程序员骑着一个很漂亮的自行车到了公司,另一个程序员看到了他,问 到,“你是从哪搞到的这么漂亮的车的?”
骑车的那个程序员说, “我刚从那边过来, 有一个漂亮的姑娘骑着这个车过来, 并停在我跟前,把衣服全脱了,然后对我说,‘你想要什么都可以’”。
另一个程序员马上说到, “你绝对做了一个正确的选择, 因为那姑娘的衣服你 并不一定穿得了”。
相关推荐
作用域作用域作用域的查找顺序新作用域的引入目录Contents01作用域作用域作用域就是一个 Python 程序可以直接访问命名空间的正文区域。Python 中,变量的访问权限决定于这个变量是在哪里赋值的。变量的作用域决定了...
一个Python表达式可以访问局部命名空间和全局命名空间里的变量。如果一个局部变量和一个全局变量重名,则局部变量会覆盖全局变量。 每个函数都有自己的命名空间。类的方法的作用域规则和通常函数的一样。 Python会...
曾经学C++的时候,经常听到这个...局部命名空间(local namespace):即函数中定义的名称 —— 包括函数中的变量、参数、局部变量等; 全局命名空间(global namespace):即模块中定义的名称 —— 包括模块中的变量、
作用:名称空间可以使栈区中存放相同的名字,从而解决命名冲突 名称空间分为三种: 内置名称空间 全局名称空间 局部名称空间 内置名称空间 内置名称空间:用于存放Python解释器中内置的名字 生命周期:Python...
命名空间举例:内置变量(内置函数abs, 内置的异常等),模块中的全局变量,函数调用时的局部变量。在某种意义上讲,对象的属性也形成一个命名空间。重要的是,不同的命名空间中的变量没有任何关联,两个不同的命名...
命名空间: 每一个作用域变量存储的位置,或者解释为 存储作用域中变量的字典。 作用: 获取想查看某个作用域中的变量名、变量值。 使用方法: locals() #当前命名空间 1. 效果图: 2. 代码 a=10 b=20 # 定义一个...
命名空间和作用域 命名空间是名字到对象的映射。目前大部分命名空间在python中都是以字典的形式存在的。 命名空间在不同的时刻被创建,同时拥有不同的生命周期。built-in命名空间在python解释器启动时被创建,并且...
作用域规则 命名空间是从名称到对象的映射,Python中主要是通过字典实现的,主要有以下几个命名空间: 内置命名空间,包含一些内置函数和内置异常的名称,在Python解释器启动时创建,一直保存到解释器退出。内置命名...
1. 变量命名要避python内置函数的名字 初学python,很容易犯这样的错误,即直接用set, list, tuple, dict, str, int, complex, float等作为变量名。这样会导致这些内置函数:set(),...局部作用域 嵌套作用域 全局作用域
一、Python中global与nonlocal 声明 ...解析名称时首先检查局部作用域,然后由内而外一层层检查外部嵌套函数定义的作用域,如找不到搜索全局命令空间和内置命名空间。 尽管可以层层向外(上)查找变量,但是!
eval() 函数用来执行一个字符串表达式,并返回表达式的值。...locals — 变量作用域,局部命名空间,如果被提供,可以是任何映射对象。 使用示例: 1、字符串转换成列表 a = [[1,2], [3,4], [5,6]
1. 函数的动态参数 1.1 *args 位置参数动态传参 def chi(*food): print(我要吃, food) chi(大米饭, 小米饭) 结果:我要吃 ('大米饭', '小米饭') # 多个参数传递进去.... 1.2 **kwargs 关键字参数动态传参 ...
locals–变量作用域,局部命名空间 应用 eval('3+4') #实现计算3+4运算,返回结果7 eval("{'name':'Tom','age':age}") #将字符串转换为字典,返回值为字典数据 age=10 eval("{'name':'Tom','age...
locals—-变量作用域,局部命名空间,如果被提供,可以是任何映射对象。 返回值—-返回表达式计算结果 2.实例: >>>x = 7 >>> eval( '3 * x' ) 21 >>> eval('pow(2,2)') 4 >>> eval('2 + 2')...
文章目录函数也是对象变量的作用域(全局变量和局部变量)局部变量和全局变量效率测试参数传递传递不可变对象的引用参数的传递传递可变对象的引用传递不可变对象的引用浅拷贝和深拷贝传递不可变对象是浅拷贝参数的几...
Session和Flash作用域 - 42 - 04.模板引擎 - 43 - 模板语法 - 43 - Expressions: ${…} - 44 - Template decorators : #{extends /} and #{doLayout /} - 44 - Tags: #{tagName /} - 45 - Actions: @{…} or @@{…} ...
Session和Flash作用域 - 42 - 04.模板引擎 - 43 - 模板语法 - 43 - Expressions: ${…} - 44 - Template decorators : #{extends /} and #{doLayout /} - 44 - Tags: #{tagName /} - 45 - Actions: @{…} or @@{…} ...