作用域
Tips:作用域是针对变量而言的,指申明的变量在程序里的可应用范围。或者称为变量的可见性。
- 内建作用域:
- 全局作用域:
- 嵌套作用域:
- 局部作用域:
- 代码块不会产生作用域
命名空间
Tips:命名空间是一个字典的实现,键为变量名,值是变量对应的值。各个命名空间是独立没有关系的,一个命名空间中不能有重名,但是不同的命名空间可以重名而没有任何影响。
- 内置命名空间:Python自带的内建命名空间,任何模块均可以访问,放着内置的函数和异常。
- 全局命名空间:每个模块加载执行时创建的,记录了模块中定义的变量,包括模块中定义的函数、类、其他导入的模块、模块级的变量与常量。
- 局部命名空间:每个函数所拥有的命名空间,记录了函数中定义的所有变量,包括函数的入参、内部定义的局部变量。
生命周期
- 内建命名空间:在Python解释器启动时创建,一直保留到Python解释器退出。
- 全局命名空间:在模块被加载时创建,通常一直保留到Python解释器退出。
- 局部命名空间:在函数调用时才被创建,但返回函数结果或抛出异常时被删除。
- Python解释器加载阶段会创建出内建命名空间,模块的全局命名空间,局部命名空间是在运行阶段函数被调用时动态创建出来的,函数调用结束动态销毁。
- 各命名空间的创建顺序:Python解释器启动->创建内建命名空间->加载模块->创建全局命名空间->函数调用->创建局部命名空间。
- 各命名空间的销毁顺序:函数调用结束->销毁函数对应的局部命名空间->Python虚拟机(解释器)退出->销毁全局命名空间->销毁内建命名空间。
两个关键字和两个函数
global
(1)
(2)
- 对于第一个程序来说,函数外的x是全局命名空间的,并绑定的值为2,调用函数创建局部命名空间,函数里的x是局部命名空间的,绑定值为4,互不影响。
-
对于第二个程序来说,同理,函数外的x是全局命名空间的,绑定值为2,调用函数创建局部命名空间,显然,函数里的x定义为局部命名空间的变量,x+=2分成两步执行,先执行x+2,再将结果赋值给x。但在执行x+2时,局部命名空间的x并没绑定值,所以报错。
- 关键字global的作用就是,将局部命名空间的变量申明为全局变量。但是这样做并不安全,可以采用参数和返回值的方法修改全局变量。
nonlocal
-
与上面同理,inner中的x并没绑定值,所以报错。
- 用nonlocal声明的变量表示在离它最近一层的局部命名空间里。
globals()和locals()
- globals():用于查看全局命名空间的变量。
- locals():用于查看当前局部命名空间的变量。
- 需要注意的是,当在全局命名空间使用locals()时,查看的是全局命名空间的变量。