多语言展示
当前在线:425今日阅读:61今日分享:18

自学Python-作用域

作用域:顾名思义,作用的范围。 如果你是自学者,而且已经进军到函数这一部分了,那么就应当了解下Python的作用域。否则你可能会像我一样,总是对一个变量名同时存在函数内和函数外且有不同值搞的晕头转向。在这里就总结一下,在本人的知识范围内所了解到的作用域是什么样的,LEGB规则到底规定了什么。
1.作用域(命名空间)的产生:
2

本地范围的产生(Local):当函数被定义后,一个属于这个函数的小天地就产生了。可以在内部定义变量,也可以在它的内部嵌套函数。这个范围就是局部范围。在局部范围的变量只能局部范围内使用。-------------------- def locals():     x=100     print('local_x = ',x+20) locals()-------------------- 输出:local_x =  120如果在全局范围内打印x就会报错:-------------------- def locals():     x=100     print('local_x = ',x+20 print(x)-------------------- 提示名字错误:x没有被定义(NameError: name 'x' is not defined)所以局部变量x仅在函数内使用。在其他地方调用时错误的。

3

嵌套范围的产生(Enclosed ):这个范围在函数嵌套时产生,介于全局和局部范围之间。比如一个函数嵌套了另一个函数,这个函数的作用域就是嵌套的范围,被嵌套的就是本地范围,如果有更多层的嵌套,那就有多层的嵌套范围。-------------------- x=20 def local_out():     y=30     def local_in():         z=40         print('本地变量z:',z)     print('嵌套变量y:',y)     local_in() print('全局变量x:',x) local_out()输出:全局变量x: 20嵌套变量y: 30本地变量z: 40--------------------

2.LEGB规则:
1

LEGB是Local,Enclosed ,Global,Built-in首字母的缩写联合。它们的范围是有小到大是这样排列的,Local----Enclosed----Global----Built-in,而且上层套下层:

2

python脚本运行时找名称的顺序:1)从它本身所在的层级找名;2)如果没有就向外层找;3)不会向内找,也不会从和它同级的层内找。

3

如果在某个层内找到,就停止寻找,即使外面有同名的。-------------------def max(s):     m=min(s)     return m  numList=[1,2,4,5,7,8,9] maxNun=max(numList) print('最大值=',maxNun)输出:最大值= 1-------------------在全局范围内,调用max()函数,因为有个自定义函数和内建的函数max()同名,所以它调用了,自定义的函数max(),就停止向外层查找。

4

同一作用域内两个名称是独立的,互不干扰。比如两个同一级别的函数内,可以定义同名的变量,或嵌套同名的函数。------------------- a=3 def add_1():     a=30     print('add_1的 a =',a)  def add_2():     a = 3000     print('add_2的 a =', a)  add_1() add_2() print('全局变量的 a =', a) 输出:add_1的 a = 30add_2的 a = 3000全局变量的 a = 3 -------------------

结束语

以上就是关于,作用域的一些规则。个人认为,尽管作用域是独立的,但避免写同名的函数,和变量。可起的名字很多,何必给自己找麻烦。END

推荐信息