当前位置: 首页 > 后端技术 > Python

Python函数进阶——全局空间和局部空间

时间:2023-03-26 02:07:47 Python

全局空间和局部空间命名空间命名空间的概念是划分和控制变量是否可见,以及生命周期的长短;命名空间的范围称为作用域。划分一个区域保存所有数据,以字典的形式存储(变量和值形成映射关系)。一共有三种。内置命名空间:解释器启动时创建,直到解释器结束,生命周期最长;全局命名空间:文件运行时创建,直到解释器结束,生命周期长;局部命名空间:调用时,里面的局部变量只在调用后创建和释放,生命周期短;创建和销毁顺序创建顺序:python解释器启动->创建内置命名空间->创建全局命名空间->创建局部命名空间销毁顺序:函数调用结束后->销毁函数对应的局部命名空间数据->销毁globalnamespacedata->Destroythebuilt-innamespacedata全局变量和局部变量什么是全局变量和局部变量局部变量是定义在函数内部的变量,局部变量位于局部命名空间中,作用域只在函数内部可见函数,也就是说只能在函数内部使用。#函数中创建的变量是局部变量deffunc():var='localvariable'#局部变量不能在非对应的局部环境中使用print(var)#错误,如果变量不存在,则全局variableisoutsidethefunction定义或定义在函数内部的变量使用global,全局变量所在的命名空间为全局命名空间,作用域跨越整个文件,也就是说全局变量可以在整个文件的任何地方使用.#全局环境中创建的变量就是全局变量var='globalvariable'deffunc():#本地也可以使用全局变量print(var)#全局变量func()最好不要相同name为全局变量,如果重名,全局变量不能在局部环境中使用。var='globalvariable'deffunc():#先使用全局变量print(var)#错误,找不到变量#然后局部变量和全局变量同名,然后新的局部变量将是在局部空间覆盖这意味着局部变量修改了全局变量;#这样全局变量就不能在局部空间使用了,之前在局部空间使用的变量就变成了先调用后定义;导致错误。var='localvariable'print(var)func()#但是同名的局部变量不会影响全局变量的值print(var)#全局变量内置函数是内置的命名空间,指的是那些带有python,内置函数。scope局部变量作用域:函数内部全局变量作用域:跨越整个文件生命周期内置变量->全局变量->局部变量内置变量在python程序运行时开始,等到python结束程序发布;全局变量将从创建中释放,直到程序结束或被清除;局部变量字从创建开始到局部空间执行或清除结束时都会被释放;使用全局局部函数和关键字。)存储全局范围内的所有内容,以字典的形式返回locals(),存储当前范围内的所有内容,以字典的形式返回globals(),返回全局范围内的所有内容.如果是全局的,调用globals后,获取打印前的所有变量,返回字典,全局空间的作用域;#定义一些全局变量a,b,c=1,2,3#调用全局函数res=globals()#首先打印,包括abcprint(res)'''Result:{'__name__':'__main__','__doc__':无,'__package__':无,'__loader__':<_frozen_importlib_external.SourceFileLoaderobjectat0x000002DBDCA5D198>,'__spec__':None,'__annotations__':{},'__builtins__':,'__file__':'E:/0-project/python/mymsr/ceshi/test6.py','__cached__':None,'a':1,'b':2,'c':3,'res':{...}}'''#定义一些变量d,e,f=1,2,3#第二次打印,包括abcdefprint(res)'''Result:{'__name__':'__main__','__doc__':None,'__package__':None,'__loader__':<_frozen_importlib_external.SourceFileLoader对象在0x000002DBDCA5D198>,'__spec__':None,'__annotations__':{},'__builtins__':,'__file__':'E:/0-project/python/mymsr/ceshi/test6.py','__cached__':无,'a':1,'b':2,'c':3,'res':{...},'d':1,'e':2,'f':3}'''如果在本地,调用globals后,获取调用前使用的变量,返回字典,全局空间作用域;#定义一些全局变量a,b,c=1,2,3#在本地环境中使用全局函数deffunc():res=globals()print(res)#callfunctionfunc()'''result:不包含def{'__name__':'__main__','__doc__':None,'__package__':None,'__loader__':<_frozen_importlib_external.SourceFileLoaderobjectat0x000001E7C287D198>,'__spec__':None,'__annotations__':{},'__builtins__':,'__file__':'E:/0-project/python/mymsr/ceshi/test6.py','__cached__':None,'a':1,'b':2,'c':3,'func':}'''#再定义一些全局变量d,e,f=4,5,6#第二次调用函数func()'''Result:containsdef{'__name__':'__main__','__doc__':None,'__package__':None,'__loader__':<_frozen_importlib_external.SourceFileLoaderobjectat0x0000021A3F3DD198>,'__spec__':None,'__annotations__':{},'__builtins__':,'__file__':'E:/0-project/python/mymsr/ceshi/test6.py','__cached__':无,'a':1,'b':2,'c':3,'func':,'d':4,'e':5,'f':6}'''可以创建全局变量动态全局变量dic=globals()print(dic)#返回系统字典'''Result:{'__name__':'__main__','__doc__':None,'__package__':None,'__loader__':<_frozen_importlib_external.SourceFileLoader对象在0x0000026F357ED198>,'__spec__':None,'__annotations__':{},'__builtins__':,'__file__':'E:/0-project/python/mymsr/ceshi/test6.py','__cached__':None,'dic':{...}}'''#在全局字典中,通过添加键值对,自动创建全局变量,对应的键为变量名,对应的值为变量dic['msr123123123']='123456'print(msr123123123)#123456#查看全局内容print(dic)'''Result:{'__name__':'__main__','__doc__':无,'__package__':无,'__loader__':<_frozen_importlib_external.SourceFileLoader对象位于0x00000161D944D198>,'__spec__':None,'__annotations__':{},'__builtins__':,'__file__':'E:/0-project/python/mymsr/ceshi/test6.py','__cached__':None,'dic':{...},'msr123123123':'123456'}'''locals()返回当前范围内的所有内容如果是global,调用locals后,获取打印前的所有变量,返回字典,全局空间范围;#定义一些全局变量a,b,c=1,2,3#调用locals函数res=locals()#首先打印,包括abcprint(res)'''Result:{'__name__':'__main__','__doc__':无,'__package__':无,'__loader__':<_frozen_importlib_external.SourceFileLoaderobjectat0x0000018C82A3D198>,'__spec__':None,'__annotations__':{},'__builtins__':,'__file__':'E:/0-project/python/mymsr/ceshi/test1.py','__cached__':None,'a':1,'b':2,'c':3,'res':{...}}'''#定义一些变量d,e,f=1,2,3#第二次打印,包括abcdefprint(res)'''Result:{'__name__':'__main__','__doc__':None,'__package__':None,'__loader__':<_frozen_importlib_external.SourceFileLoaderobjectat0x0000018C82A3D198>,'__spec__':None,'__annotations__':{},'__builtins__':,'__file__':'E:/0-project/python/mymsr/ceshi/test1.py','__cached__':无,'a':1,'b':2,'c':3,'res':{...},'d':1,'e':2,'f':3}'''如果在本地,调用locals后,获取调用前的所有变量,返回字典,局部空间作用域;#定义一些局部变量deffunc():#局部变量aa,bb,cc=11,22,33#第一次调用res=locals()#第一次打印,包括aabbccprint(res)#{'cc':33,'bb':22,'aa':11}#定义一些局部变量dd,ee,ff=44,55,66#第二次打印,不包括ddeeffprint(res)#{'cc':33,'bb':22,'aa':11}#调用第二遍res2=locals()#打印第一个调用,包括ddeeffprint(res)#{'cc':33,'bb':22,'aa':11,'ff':66,'ee':55,'dd':44,'res':{...}}#打印第二个调用,包括ddeeffprint(res2)#{'cc':33,'bb':22,'aa':11,'ff':66,'ee':55,'dd':44,'res':{...}}#调用函数,返回局部变量func()关键字在函数中global声明全局变量,获得使用和修改全局变量的权限nonlocal修改局部变量(当前函数之上的局部变量)global在局部环境中创建的变量是局部变量,不能在全球环境中使用,但使用global定义的变量是全局变量,可以在全局环境中使用。deffunc():var='localvariable'globalglvarglvar='globalvariable'#必须执行局部环境func()#print(var)在全局环境#错误,局部变量不能被调用#使用全局定义的变量是全局变量print(glvar)#全局变量不能修改局部环境中全局变量的值。使用global可以修改局部环境中的全局变量。var='globalvariable'deffunc():globalvarvar='modifiedinthelocalenvironment'func()print(var)#局部环境修改函数的嵌套在学习nonlocal之前,我们需要了解一下函数嵌套知识。内部函数和外部函数可以相互嵌套。外函数称为外函数,内函数称为内函数。defouter():print('Mynameisouter,it'sanouterfunction')definner():print('Mynameisinner,insidetheouter,it'saninnerfunction')#在outer中执行inner函数functioninner()#执行外层函数outer()'''结果:我叫outer,外层函数叫inner,outer里面就是inner函数'''inner函数不能在outer外直接执行功能。调用了外层函数后,内层函数也不可能从函数外调用内层函数。它只能从外部函数的内部调用。所有场景。#外层为outer,内层为inner,最内层更小,调用更小的所有代码defouter():print('我叫outer,是最外层函数,是最外层函数innerandsmaller')definner():print('我的名字是inner,它是outer的内函数,它是smaller的外函数')defsmaller():print('我的名字是smaller,它是outer和inner的inner函数')#先在inner中执行smallerinsmaller()#然后在outer中执行innerinner()#最后执行outer执行smaller函数outer()'''结果:我叫outer,是最外层函数和inner和smaller的外层函数Mynameisinner,是outer的内层函数,是smaller的外层函数Mynameissmaller,是outer和inner的内层函数'''多个函数嵌套时要注意,无论外层函数还是内层函数,都是Functions,只要函数中的变量是局部变量。内涵可以使用外层函数的局部变量,但外层函数不能直接使用内层函数的局部变量。LEGB原理LEGB原理是一种就近查找变量的原理。按照就近原则,由下向上,由内向外查找。B————Builtin(Python):Python内置模块命名空间(内置作用域)G————Global(模块):函数外的命名空间(全局作用域)E————EnclosingFunctionLocals:作用域外层嵌套函数(nestedscope)L——Local(Function):当前函数内部的作用域(localscope)当前本地环境。那么我们就知道,nonlocal的使用环境至少是基于这个函数的二级嵌套环境,而且在外层的local环境中必须有一个局部变量。defouter():#定义变量lvar='outervar'definner():#inner函数使用nonlocal修改上层的局部变量nonlocallvarlvar='innervar'#执行inner函数inner()print(lvar)outer()#innervar如果上层本地环境没有这个变量,则按照LEGB原则向上查找。defouter():#定义变量lvar='outervar'definner():defsmaller():#修改smaller中的变量,但不修改inner中的变量,查找并修改outer中的变量nonlocallvarlvar='smallervar'#执行更小的函数smaller()#执行内层函数inner()print(lvar)#执行外层函数outer()如果逐层查找直到最外层函数没有这个变量,那么就会报错,因为nonlocal只会修改局部变量,如果超出作用域,就会报错。var=1#变量在最外层函数外,即全局变量,非局部不能修改defouter():definner():defsmaller():nonlocalvar#错误,没有局部变量var=2print(var)smaller()inner()outer()全局变量和局部变量总结全局变量在局部环境下可以调用,但是不能修改(但是如果全局变量是变量数据,可以修改值)局部变量不能在全局环境中调用变量不能修改函数global()(在函数内部使用,可以对全局变量进行操作)1.全局变量可以在局部环境中定义2.全局变量可以在函数中修改局部环境nonlocal()(用于内部函数,可以在内层函数中修改外层函数中的局部变量)关键字locals1和locals获取当前作用域内的所有变量。如果在全局调用locals之后,在打印并返回字典之前获取所有变量。如果全局作用域是本地调用loclas后,获取调用前的所有变量,返回一个字典。局部作用域globals2和globals只获取全局空间中的所有变量。如果全局调用globals,则获取打印前使用的所有变量,并返回一个字典。,全局作用域如果在本地调用globals后,获取到调用前使用的变量,返回字典,则为全局作用域