抬抬小手学PythonPython之作用域下的global和
global和nonlocal作用域
该部分内容涉及Python变量作用域相关知识,变量作用域指的是变量的有效作用范围,直接理解就是Python中的变量不是任意位置都可以访问的,有限制条件。
一般情况下变量的作用域变化范围是块级、函数、类、模块、包等,级别是从小到达。Python中是没有块级作用域的,所以我们在写代码的时候,下面的代码是正确的。ifTrue:xhelloworld因为没有块级作用域,故if代码块中的变量x可以被外部访问到print(x)
在Python中常见的块级作用域有if语句、for语句、while语句、with上下文语句。Python中的作用域
上文已经提及了作用域是Python程序可以直接访问一个变量的作用范围,Python的作用域一共有4种,分别如下:L(Local):最内层,包含局部变量,例如函数(方法)内部;E(Enclosing):包含非局部(nonlocal)也非全局(nonglobal)的变量,在嵌套函数中,函数A包含函数B,在B中去访问A中的变量,作用域就是nonlocal,直白理解就是闭包函数外的函数中的变量;G(Global):代码最外层,全局变量;B(Builtin):包含内建变量。
一个比较经典的案例如下:内建作用域Builtinxint(52)全局作用域Globalglobalvar0defouter():闭包函数外的函数中Enclosingoutvar1definner():局部作用域Localinnervar2
在Python中变量寻找的顺序是从内到外,先局部,然后外部,在全局,在内建,这种规则叫做LEGB规则。
增加以下学习的趣味性,你可以研究下述代码中变量是如何变化的。lenlen(〔〕)defa():len1defb():len2print(len)b()a()global关键字
定义在函数内部的变量拥有一个局部作用域,定义在函数外部的变量拥有全局作用域。
局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。全局变量x0defdemo():此时的x是局部变量x123print(函数内是局部变量x,x)demo()print(函数外是全局变量x,x)
输出结果,函数内部是123,函数外部依旧是0。
如果希望函数内部(内部作用域)可以修改外部作用域的变量,需要使用global关键字。全局变量x0defdemo():此时的x是全局变量globalxx123print(函数内是局部变量x,x)demo()print(函数外是全局变量x,x)
此时输出的就都是123了,还有一点需要注意,在函数内容如果希望修改全局变量的值,global关键字一定要写在变量操作前。defdemo():此时的x是全局变量x123globalxprint(函数内是局部变量x,x)
该代码会出现语法错误:SyntaxError:namexisassignedtobeforeglobaldeclaration
除了以上知识外,要记住在函数内部使用一个变量,不修改值的前提下,没有声明,默认获取的是全局变量的值。x全局变量defdemo():print(x)demo()
全局变量还存在一个面试真题,经常出现,请问下述代码运行结果。x10defdemo():x1print(x)demo()
结论是报错,原因就是demo函数运行时,会先计算x1,对变量进行计算之前需要进行声明与赋值,但是函数内部对x没有初始化操作,故报错。nonlocal关键字
如果要修改嵌套作用域(Enclosing作用域)中的变量,需要nonlocal关键字,测试代码如下:defouter():num10definner():nonlocal关键字nonlocalnumnum100print(num)inner()print(num)outer()
输出结果自行测试,注意nonlocal关键字必须是Python3。X版本,Python2。X版本会出现语法错误:nonlocalnumSyntaxError:invalidsyntax
nonlocal不能代替global,例如下述代码,注释掉外层函数的变量声明,此时会出现SyntaxError:nobindingfornonlocalnumfound错误。num10defouter():注释掉本行num10definner():nonlocal关键字nonlocalnumnum100print(num)inner()print(num)outer()
在多重嵌套中,nonlocal只会上溯一层,如果上一层没有,则会继续上溯,下述代码你可以分别注释查看结果。num10defouter():num100definner():num1000definner1():nonlocalnumnum10000print(num)inner1()print(num)inner()print(num)outer()
局部变量和全局变量具体有哪些,可以通过locals()和globals()两个内置函数获取。x全局变量defdemo():y局部变量print(locals())print(x)demo()print(globals())print(locals())这篇博客的总结
本篇博客为大家说明了Python的作用域,并且对global和nonlocal关键字进行了学习,希望对你有所帮助。
初见i911900KB性能小钢炮英特尔猛兽峡谷NUC深度体验英特尔NUC,一个有些小众而又独特的产品线。它的魅力在于,如果你真的使用它作为桌面办公的首选设备,那么就很难再找到比它更合适的替代品。出色的扩展性、丰富的可玩性、足够支持办公应……
小米是如何把对手逼死,把自己逼疯的小米内部做产品的一个态度,雷军做产品最重要的一个核心:极致。但雷军在小米却很少说极致这个词,说的是变态。今天我们就来分享一下变态的极致。一、什么是变态的极致?就是性能大幅……
哪位大神分享下旧照片修复经验?修复老旧照片主要有几点?一:第一步把老旧照片纸质改为电子档。这是最简单最直接的。所以你需要把照片扫描到电脑。二,然后再视破旧根据实际情况判定能否修复的可行性。……
卖牛肉的郭宏才,玩比特币的宝二爷在币圈,他就是江湖。郭宏才,币圈人称宝二爷,他却常常自称卖牛肉的。2018年3月,他在硅谷购置了一套百亩大的豪宅。4月23日这一天,他将印有韭菜庄园的牌子正式挂在了……
iPhone13将支持LEO连接可在无信号覆盖的情况下实现通据可靠的分析师郭明錤称,iPhone13将具有低地球轨道(LEO)卫星通信连接功能,允许用户在没有4G或5G覆盖的地区打电话和发信息。在一份给投资者的说明中,郭明錤解释说,iP……
美国批准向华为出售汽车零部件芯片?华为回应正在核实确认据环球网援引路透社25日消息,两名知情人士透露,美国已经批准了供应商数亿美元的许可证申请,允许其向华为出售用于汽车零部件的芯片。报道称,在近几周和近几个月,熟悉流程的人士……
400块搞定苹果全家桶!无线充电板还带磁吸,要啥Airpow作者元亦来源极果编辑部众所周知,苹果产品的续航问题一直被诟病,手机则是被吐槽得最严重。虽然近年来在充电技术上不断升级,从iPhone8的QI无线充电到iPho……
人工智能威胁人类?1995年,我刚开始创业的时候,全世界的互联网用户可能还不到5万人,全世界的互联网从业者也不到5万人。但是今天,到云栖大会参加会议的人数已经接近5万,全世界使用互联网的人数已经……
python函数的调用11:简单的函数演示:这个enumerate函数挺有意思,用一次就爱不释手,可以自己去敲敲代码感受一下。books〔红楼梦,水浒传,三国演义,西游记〕defshowb……
互联网创业,抄袭已成常态昨天有一个朋友找到我发了一个公众号给我,举报说抄袭他自己。通常我都会直接回答司空见惯这四个字。并不是说我们没有没有渠道去压制这种现象,只是我觉得完全没有必要。……
一号双终端业务,安徽地区来了,开通eSIM后,跑步不用再带上安徽移动支持开通一号双终端业务了。根据中国移动一号双终端官网显示,最新增加支持安徽地区开放一号双终端业务办理。安徽移动的用户,现在可以尝试为自己的智能手表开通eSIM功能……
生活中常见的兼职一、任务跑腿类这种跑腿类还是比较多的,主要是各种送外卖、代拿快递、代买物品之类的跑腿任务。美团众包UU跑男达达骑士,这个前期有五单免费的顺丰同城骑士5地推拉新类,也……