长沙网站建设网,网站开发费入什么费用,公司高端网站建,做网站的控件命名空间是名称与对象之间的关系#xff0c;可以将命名空间看做是字典#xff0c;其中的键是名称#xff0c;值是对象。
命名空间不共享名称。
在命名空间中的名称能将任何python对象作为值#xff0c;在不同的命名空间中相同的名称可以与不同的对象相关联。但是#xf…命名空间是名称与对象之间的关系可以将命名空间看做是字典其中的键是名称值是对象。
命名空间不共享名称。
在命名空间中的名称能将任何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中有一种称为“本地赋值”的规则非常有趣。如果在函数内的任何地方进行局部赋值则该赋值只在当前活动的命名空间中创建名称。有时这将产生副作用举例如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 value 27 def func(param1,param2): for key,valin locals().items(): print (key,val) value value 1 func(98765,43210) param198765 param243210 Traceback (most recent call last): File pyshell#7, line1,in module func(98765,43210) File pyshell#6, line4,in func value value 1 UnboundLocalError: local variablevalue referenced before assignment 首先通过赋值在全局命名空间中创建了变量value。也许你会认为当函数值加1是会先在局部的命名空间中查找变量无法找到时在全局命名空间中找到该名字。可以并不是这样。
python提出如下假设如果在函数体内的任何地方对变量赋值则python将名称添加到局部命名空间中。语句valuevalue1对对象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规则是先检查局部命名空间之后是封闭在局部命名空间中的其他函数之后是全局命名空间在最后以内置命名空间结束。