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

#扬扬小手学节#Python作用域下的global和nonlocal关键字

时间:2023-03-25 21:17:19 Python

globalandnonlocalscope这部分涉及Python变量作用域的知识。变量的范围是指变量的有效范围。直接的理解就是Python中的变量是不能随处访问的,是有限制的。一般来说,变量的范围从块级别、函数、类、模块、包等,级别由小到小。Python中没有块级作用域,所以我们写代码的时候,下面的代码是正确的。ifTrue:x="helloworld"#因为没有块级作用域,所以if代码块中的变量x可以从外部访问到print(x)。Python中常见的块级作用域包括if语句、for语句、while语句、withcontext语句。Python中的作用域如上所述,作用域是Python程序可以直接访问变量的作用域。Python中有四种作用域,如下:L(Local):最内层,包括局部变量,例如函数(方法)内部;E(Enclosing):包含非局部(nonlocal)或全局(nonglobal)的变量。在嵌套函数中,函数A包含函数B,在B中访问A中的变量。定义域是非局部的,直白的理解就是函数内的变量在闭包函数之外;G(Global):代码的最外层,全局变量;B(内置):包含内置变量。一个比较经典的案例如下:#Built-inscopeBuilt-inx=int(5/2)#GlobalscopeGlobalglobal_var=0defouter():#将out_var=1封装在闭包函数之外的一个函数中definner():#LocalscopeLocalinner_var=2Python中查找变量的顺序是从内到外,首先是local,然后是external,global,built-in。此规则称为LEGB规则。为了给下面的学习增添趣味,您可以研究以下代码中的变量如何变化。len=len([])defa():len=1defb():len=2print(len)b()a()global函数内部定义的变量有局部作用域,定义在Variablesoutsidefunctions具有全球范围。局部变量只能在声明它们的函数内访问,而全局变量可以在整个程序中访问。#全局变量x=0defdemo():#此时x是局部变量x=123print("函数是局部变量x=",x)demo()print("函数是全局变量x=",x)函数内输出结果为123,函数外为0。如果希望外部作用域中的变量在函数内部(内部作用域)是可修改的,则需要使用global关键字。#全局变量x=0defdemo():#此时x是一个全局变量globalxx=123print("Thefunctionisalocalvariablex=",x)demo()print("Thefunctionisaglobalvariablex=",x)这时候输出的都是123,还有一点要注意。如果要在函数内容中修改全局变量的值,必须在变量操作前写global关键字。defdemo():#此时x是一个全局变量x=123globalxprint("Thefunctionisalocalvariablex=",x)这段代码会出现语法错误:SyntaxError:name'x'is全局声明前赋值除了以上知识外,记得在函数内部使用变量,不修改值,不声明,默认获取全局变量的值。x="globalvariable"defdemo():print(x)demo()还有一个全局变量的真人面试题,经常出现。请问下面代码运行的结果。x=10defdemo():x+=1print(x)demo()结论是报错。原因是demo函数运行时,会先计算x+1,计算前需要先声明变量并赋值,但是函数内部并没有对x进行初始化操作,所以报错。nonlocal关键字如果要在嵌套作用域(Enclosingscope)内修改变量,则需要nonlocal关键字,测试代码如下:defouter():num=10definner():#nonlocalkeywordnonlocalnumnum=100print(num)inner()print(num)outer()输出结果自测,注意nonlocal关键字必须是Python3.X+版本,Python2.X版本会出现语法错误:nonlocalnum^SyntaxError:invalidsyntax`nonlocal不能代替global,比如下面的代码,注释掉外层函数的变量声明,就会出现SyntaxError:nobindingfornonlocal'num'found错误。num=10defouter():#注释掉这一行#num=10definner():#nonlocal关键字nonlocalnumnum=100print(num)inner()print(num)outer()在多重嵌套中,nonlocal只会往上一层,如果没有上一层,就继续往上。您可以注释以下代码以查看结果。num=10defouter():num=100definner():num=1000definner1():nonlocalnumnum=10000print(num)inner1()print(num)inner()print(num)outer()local具体变量和全局变量可以通过两个内置函数locals()和globals()获取。x="globalvariable"defdemo():y="localvariable"print(locals())print(x)demo()print(globals())print(locals())本博客的总结本博客解释Python适用范围给大家,学习global和nonlocal关键字,希望对你有所帮助。