python作用域的顺序_干货!Python入门基础之变量作用域、LEGB原则以及global语句...

Python学习中,有时候在命名变量名和访问变量名时总有混乱,于是,我便好好捋一下变量作用域的规则。

1、变量作用域:

标识符的作用域是定义为其声明在程序里的可应用范围, 或者即是我们所说的变量可见性。换句话说,就是你可以在程序里的哪些部分去访问一个变量。变量可以是局部域或者全局域。

u=2514079441,2460295347&fm=173&app=25&f=JPEG?w=198&h=135&s=2BE87A2372869BA3783DB0CB0100C0A0

命名空间:python的命名空间是对变量名的分组划分。不同组的相同名称的变量视为两个独立的变量,因此隶属于不同分组(即命名空间)的变量名可以重复。所以python的局部变量名称可以和全局变量名称重复。

u=50717544,1622134105&fm=173&app=25&f=JPEG?w=198&h=148&s=4ACA72235BF17DB718F100D20100C0B0

变量可以在三个地方分配,对应三个不同作用域:

1、 在def内赋值,则是函数之内的局部变量,只在函数内有效。

2、 若变量在嵌套def中赋值,则对于嵌套函数来说,变量不是本地的。

3、 在def之外声明的变量,则是全局变量。

u=3426042992,1862360947&fm=173&app=25&f=JPEG?w=240&h=240&s=008CF013410A77ED26DD515E0300D030

2、变量名解析的LEGB原则:

首先解释LEGB:

L是local,指局部变量,作用于函数内部。

E是Enclosing function locals可能是嵌套函数内,比如python嵌套函数。这个涉及到了函数的闭包,下一篇我再介绍。

G是Global,是全局变量,定义在函数体外,在整个文件中都可以访问。

B是Buildin,Python内置模块的名字空间函数名称等,比如dict、len()等。

Python的命名空间实际是一个字典,字典内保存了变量名称与对象之间的映射关系,因此,查找变量名就是在命名空间字典中查找键-值对。

u=3088200036,121204139&fm=173&app=25&f=JPEG?w=263&h=220&s=4700FC030AF247AF1F89A45E03004063

Python有多个命名空间,因此,需要有规则来规定,按照怎样的顺序来查找命名空间,LEGB就是用来规定命名空间查找顺序的规则。LEGB规定了查找的顺序为:local>enclosing function locals>global>builtin

3、运用实例:

1、LG

变量命名实例:

u=3714970910,2471385209&fm=173&app=25&f=JPEG?w=546&h=586&s=E8C2B744BAAE976C4C54A40E0000E0C1

在函数外面访问函数内的变量:发现变量并没有被定义。

u=2806577512,1288005526&fm=173&app=25&f=JPEG?w=629&h=512&s=A8C2B340DAACBF6C54CDC50E0000E0C1

2、LEG查找,请看下面代码以及输出结果

u=355772506,1457661324&fm=173&app=25&f=JPEG?w=451&h=493&s=E8C2B344BAAE876C5E79A40F0000E0C3

解释一下:上面总共在三个位置都给一个同一个变量名称赋值,但是我们是在最里面的一个函数访问的那个变量,当inner函数要打印a_var变量的时候,它便按照LEGB的顺序查找这个变量,所以便输出了'本地变量'。

3、 Built-in

在python中,我们可以直接查看内置变量,如下;显示一部分

u=2698076725,1837810178&fm=173&app=25&f=JPEG?w=640&h=253&s=4562BB42D3E099510E55EC1A010030C2

实例:

u=3989047551,2129946294&fm=173&app=25&f=JPEG?w=495&h=594&s=A0C2B7409AAE976C4EF98D0F0000E0C3

在这里我们定义了一个自己的len函数,当我们调用len的时候,按照LEGB顺序,是调用我们自己声明的函数,而不是内置函数。

4、global访问修改全局变量

正常情况下我们在函数内访问全局变量,只能对其访问,而不能修改,这时,利用global声明我们就可以修改全局变量。

实例:

u=1489244261,4062803249&fm=173&app=25&f=JPEG?w=610&h=610&s=A8C2B742DAAEB76C0C5DE40F0000E0C3

注意:不建议在函数内直接修改全局变量,容易造成混乱,因为这经常造成混乱或者很难调试的奇怪错误。如果你想要通过一个函数来修改一个全局变量,建议把它作为一个变量传入,然后重新指定返回值。

u=774348279,4002289703&fm=173&app=25&f=JPEG?w=531&h=424&s=A0C2B540FAE49F6C1E59E40E0000E0C3

码字不易,多多关照,谢谢。

u=1493758850,2286461467&fm=173&app=25&f=JPEG?w=254&h=232&s=84146C32114476EA565450660300A060

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值