Python局部变量、全局变量、作用域、名称空间
局部变量与全局变量
首先看看什么是局部变量与全局变量:
全局变量:在模块内、在所有函数和class的外面。
局部变量:在函数内、在class的方法内。
这里注意到的是,我们说的全局变量一定是在当前工作的 .py (即当前的模块)文件里面的变量,但是却不是模块里面定义的函数或者类里面定义的变量。
举个例子:
a = 1
def func():
b = 2
class test_class():
def class_func():
c = 3
在这个例子当中,全局变量就只有a一个,局部变量有b和c。
函数调用变量
函数调用自身函数内部的变量
在函数内部定义的变量,函数是可以直接调用的,但是要注意的是,如果超出函数范围,而且范围外没有同名的变量,此变量就无法在被访问。
函数调用全局变量
函数内部是可以访问到全局变量的,但是我们不能更改函数变量。举个例子:
a = 1
def func():
print(a)
func()
结果:
>>> 1
这里的a就是全局变量,函数内部可以访问,但是我们试图修改这个值的时候,就会出现错误:
a = 1
def func():
a += 1
print(a)
func()
结果:
>>> UnboundLocalError: local variable 'a' referenced before assignment
这是什么原因呢,我们需要解释一下python解释器在查找变量时的工作方式。
首先python解释器会试图在内部函数找引用的变量是否有定义,如果没有找到,那么就会在外面找,比如全局变量中查找,如果还是没有找到呢,它就会在python内置的变量中查找。
在函数 func() 中查找变量a的基本顺序大致就是:
- 看函数func()是否定义了a;
- 好,在func()中没有找到,那么就在当前工作的模块中查找;
- 在当前模块中也没有找到,就在python内置的变量中查找;
- 如果这时还是没有找到变量定义呢?这时候就会报错了,显示错误如下:
NameError: name 'b' is not defined