命名空间作用域与文件作用域的区别,命名空间作用域的一般形式是
名称空间名称空间是存储名称和对象之间的映射/绑定关系的地方。对于x=6,Python会申请内存空间存储对象6,然后在名称空间存储名称x和3的绑定关系,del x表示清除绑定关系。
程序执行过程中最多有三个命名空间。
内置名称空间是随着python解释器的启动/关闭而生成/回收的,所以它是第一个加载的名称空间,用来存储一些内置名称,比如内置函数名。
全局名称空间是随着python文件执行的开始/完成而生成/回收的,它是第二个加载的名称空间,其中存储了文件执行过程中生成的所有名称。
导入#模块名sys
X=1 #变量名x
如果x==1:
Y=2 #变量名y
Def foo(x): #函数名foo
y=1
定义栏():
及格
类别栏:#类别名称栏
Pass本地命名空间是随着函数的调用/结束而临时生成/回收的,函数中定义的函数参数和名称都会存储在这个命名空间中。
def foo(x):
当y=3 #调用一个函数时,该函数代码将被执行。名称X和Y存储在函数的本地名称空间中。命名空间的加载顺序是:内置命名空间-全局命名空间-本地命名空间。
要查找名称,必须从三个名称空间中的一个中查找,搜索顺序为:本地名称空间-全局名称空间-内置名称空间。
作用域全局作用域和局部作用域可以根据名称作用域的不同将三个名称空间分为两个区域:
全局作用域:全局命名空间和内置命名空间中的名字属于全局作用域,这个作用域中的名字是全局活的(除非删除,否则在整个文件执行过程中都会存活)和全局有效的(可以在任何地方使用);本地范围:本地命名空间中的名称属于本地范围。此范围内的名称是临时活动的(即调用函数时临时生成,调用函数后释放)和本地有效的(只能在函数内使用)。
范围和名称查找的优先级在局部范围内查找名称时,起始位置是局部范围,所以先搜索局部命名空间,没有找到,再搜索全局范围:先搜索全局命名空间,没有找到,再搜索内置命名空间,最后如果没有找到会抛出异常。
X=100 #全局作用域x的名称
def foo():
X=300 #本地作用域X的名称
打印(x) #在本地查找x
O () #结果是300x=100 #全局作用域的名称x
def foo():
X=300 #本地作用域X的名称
打印(x) #在本地查找x
O () #结果是300。在全局范围内寻找名字时,起始位置是全局范围,所以先寻找全局命名空间,如果找不到,再寻找内置命名空间,最后会抛出异常。
x=100
def foo():
X=300 #调用函数时生成局部作用域的名称X
foo()
Print(x) #全局寻找x,结果是100
注意:可以调用内置函数locales()和globals()分别查看局部作用域和全局作用域的名称,结果都是字典格式。在全局范围内查看的局部变量()的结果等于全局变量()
Python支持函数的嵌套定义。在嵌入式函数中查找名称时,它会优先查找自身局部作用域的名称,然后由内向外逐层查找外部嵌套函数定义的作用域。如果没有,它将搜索全局范围。
x=1
定义外部():
x=2
Def inner(): #函数名inner属于外层的范围。
x=3
打印(内部x:%s %x )
内部()
print(外部x:%s %x )
外部()
#结果是
内部x:3
Outer x:2在一个函数中,无论嵌套了多少层,都可以看到全局作用域的名称。如果你想在一个函数中修改全局名字空间中名字的值,当值是不可变的时候,你需要使用global关键字。
x=1
def foo():
Global #声明x是全局名称空间的名称。
x=2
foo()
Print(x) #结果是2。当参数的值是可变类型时,函数体中值的修改将直接反映到原始值,
数字列表=[1,2,3]
def foo(nums):
nums.append(5)
foo(数字列表)
打印(数字列表)
#结果是
[1,2,3,5]对于嵌套的多级函数,可以使用nonlocal关键字将名称声明为来自外部嵌套函数定义的作用域(非全局)。
定义f1():
x=2
定义f2():
非局部x
x=3
F2() #调用F2()来修改f1作用域中名称X的值。
f1范围内的打印(x) #视图x
f1()
#结果
3nonlocal x将从当前函数的外层函数开始逐层搜索名称X。如果直到最外层的函数都找不到,就会抛出异常。
转载请联系作者获得授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。