命名空间和作用域
命名空间是从名称到对象的映射,
命名空间提供了在项目中避免名字的冲突的方法,各个命名空间是独立的,没有任何关系的。一个命名空间中不能有重名,但不同的命名空间可以重名是没有影响的。
Python中有三种命名空间:
- 内置名称(built-in names):Python内置的名称
- 全局名称(global names):模块中定义的名称,记录了模块的变量(函数、类、其他导入的模块、模块级的变量和常量)
- 局部名称(local names):函数中定义的名称,记录了函数的变量(函数的参数和局部定义的变量)
查找变量的顺序:局部的命名空间–>全局命名空间–>内置命名空间
命名空间的生命周期取决于对象的作用域,如果对象执行完成,则该命名空间的生命周期就结束了。无法从外部命名空间访问内部命名空间的对象。
作用域
作用域就是一个Python程序可以直接访问命名空间的正文区域。
程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。
变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。
Python中有4中作用域:
- L(local):最内层,包含局部变量
- E(Enclosing):包含了非局域(non-local)也非全局(non-global)的变量。两个嵌套函数,内部函数的名称对于外部函数的作用域就为non-local。
- G(Global):当前脚本的最外层
- B(Built-in):包含了内建的变量/关键字等
查找规则:L->E->G->B
Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域
全局变量和局部变量
定义在函数内部的变量拥有一个局域作用域,定义在函数外的拥有全局作用域。
局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。
global和nonlocal关键字
global使用是在局部使用全局变量的声明。
nonlocal修改嵌套作用域中的变量。