Python3 命名空间和作用域

100 阅读1分钟
命名空间提供了在项目中避免名字冲突的一种方法
命名空间查找顺序:
假设我们要使用变量 runoob,则 Python 的查找顺序为:**局部的命名空间 -> 全局命名空间 -> 内置命名空间**。

作用域就是一个 Python 程序可以直接访问命名空间的正文区域
有四种作用域:
-   **L(Local)** :最内层,包含局部变量,比如一个函数/方法内部。
-   **E(Enclosing)** :包含了非局部(non-local)也非全局(non-global)的变量。比如两个嵌套函数,
一个函数(或类) A 里面又包含了一个函数 B ,那么对于 B 中的名称来说 A 中的作用域就为 nonlocal。
-   **G(Global)** :当前脚本的最外层,比如当前模块的全局变量。
-   **B(Built-in)** : 包含了内建的变量/关键字等,最后被搜索。

规则顺序: **L –> E –> G –> B**。

### global 和 nonlocal关键字
当内部作用域想修改外部作用域的变量时,就要用到 global关键字了
如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字了