Python变量作用域的规则以及如何搜索内置作用域
Posted 梦子mengy7762
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python变量作用域的规则以及如何搜索内置作用域相关的知识,希望对你有一定的参考价值。
喜欢编程,热爱分享,希望能结交更多志同道合的朋友,一起在学习Python的道路上走得更远!有不懂的问题可以私聊我哦!
**作用域:**是指变量的生效范围,例如本地变量、全局变量描述的就是不同的生效范围。
python的变量作用域的规则非常简单,可以说是所有语言中最直观、最容易理解的作用域。
在开始介绍作用域之前,先抛一个问题:
1 x=1 2 def f(): 3 x=34 g() 5 print("f:",x) # 3 6 7 def g(): 8 print("g:",x) # 1 9 10 f() 11 print("main:",x) # 1
上面的代码将输出3、1、1。
python作用域规则简介
**它有4个层次的作用域范围:**内部嵌套函数、包含内部嵌套函数的函数自身、全局作用域、内置作用域。上面4个作用域的范围排序是按照从内到外,从小到大排序的。
其中:
- 内置作用域是预先定义好的,在__builtins__模块中。这些名称主要是一些关键字,例如open、range、quit等
- 全局作用域是文件级别的,或者说是模块级别的,每个py文件中处于顶层的变量都是全局作用域范围内的变量
- 本地作用域是函数内部属于本函数的作用范围,因为函数可以嵌套函数,嵌套的内层函数有自身的内层范围
- 嵌套函数的本地作用域是属于内层函数的范围,不属于外层
所以对于下面这段python代码来说,如果它处于a.py文件中,且没有嵌套在其它函数内:
1 X=1 2 def out1(i): 3 X=2 4 Y='a' 5 print(X) 6 print(i) 7 def in1(n): 8 print(n) 9 print(X,Y) 10 in1(3) 11 out1(2)
那么:
处于全局作用域范围的变量有:X、out1
处于out1本地作用域范围的变量有:i、X、Y、in1
处于嵌套在函数out1内部的函数in1的本地作用域范围的变量有:n
注意上面的函数名out1和in1也是一种变量。
如下图所示:
搜索规则
当在某个范围引用某个变量的时候,将从它所在的层次开始搜索变量是否存在,不存在则向外层继续搜索。搜索到了,则立即停止。
例如函数ab()中嵌套了一个函数cd(),cd()中有一个语句print(x),它将首先检查cd()函数的本地作用域内是否有x,如果没有则继续检查外部函数ab()的本地作用域范围内是否有x,如果没有则再次向外搜索全局范围内的变量x,如果还是没有,则继续搜索内置作用域,像"x"这种变量名,在内置作用域范围内是不存在的,所以最终没有搜索到,报错。如果一开始在cd()中就已经找到了变量x,就不会再搜索ab()范围以及更外层的范围。
所以,内层范围可以引用外层范围的变量,外层范围不包括内层范围的变量。
内置作用域
内置作用域主要是一些内置的函数名、内置的异常等关键字。例如open,range,quit等。
两种方式可以搜索内置作用域:一是直接导入builtins模块,二是让python自动搜索。导入builtins模块会让内置作用域内的变量直接置于当前文件的全局范围,自动搜索内置作用域则是最后的阶段进行搜索。
一般来说无需手动导入builtins模块,不过可以看看这个模块中包含了哪些内置变量。
1 >>> import builtins 2 >>> dir(builtins) 3 ['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', ............... 4 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']
觉得文章还不错的话不妨收藏起来慢慢看,有任何建议或看法欢迎大家在评论区分享讨论!
我是一名python开发工程师,整理了一套python的学习资料,如果你想提升自己,对编程感兴趣,关注我并在后台私信小编:“08”即可免费领取资料!希望对你能有所帮助
以上是关于Python变量作用域的规则以及如何搜索内置作用域的主要内容,如果未能解决你的问题,请参考以下文章