作为一个从 Java 过来的人来说,Python 的作用域有点奇葩,作为开发者,只需要关注全局作用域和局部作用域就好了,全局作用域就是说白了模块(单个 .py 文件中)直接声明的变量。
比如有个 demo.py 的文件,含有以下代码:
var_global='global_var'#这个var_global就是全局作用域
def globalFunc():
var_local='local_var'#这个就是局部变量
class demo():
class_demo_local_var='class member'#这里也是局部变量
def localFunc(self):
var_locals='local_func_var'#这里也是局部变量
以上只是说明了全局变量仅仅是在 .py 文件中直接声明的变量叫全局变量,还有在 .py 文件中直接写的逻辑代码块中,也是全局变量。也就是说在 if/elif/else/、try/except、for/while 等逻辑代码块中的变量。
这个教程中在介绍三种命令空间的时候,说查找变量的顺序为局部的命名空间去 -> 全局命名空间 -> 内置命名空间,但是我理解的变量查找顺序为:当前域 -> 外部域(如果有) -> 全局域 -> 内置域。
光说没有什么概念,我们来一段代码就清楚了。
我们以 demo1.py 为例子:
global_var='this var on global space'
'''
申明global_var这个位置就是全局域,也就是教程中所说的全局作用域,
同时它也是直接声明在文件中的,而不是声明在函数中或者类中的变量
'''
class demo():
class_demo_local_var='class member'
'''
虽然class_demo_local_var在这里是局部变量,这个局部变量的域相对于var_locals是外部域,
所以可以直接被var_locals所在的更小的局部域访问
'''
def localFunc(self):
var_locals='local_func_var'
'''
这里也是局部变量,但是相对于class_demo_local_var变量,却是更小的域,
因此class_demo_local_var所在的哪个域无法访问到当前域来
'''
print(self.class_demo_local_var)#到这里会查找当前域中有没有class_demo_local_var这个变量,然后再到相对于当前域的外部域去