高阶提示:对于高级Python程序员来说,了解这个主题是有用的。
首先我们先看一下,作用域和命名空间是什么?
1 命名空间(Namespace)
一个名字到对象的映射。
有点像字典的功能。命名空间举例来说有:内置的函数;模块里面的全局变量;函数里面的局部变量。一个对象的属性也是一个命名空间。命名空间的作用是为了防止名字(函数等)的冲突。
这里的属性指的任何在点之后的名字。如:z.real,则real是对象z的属性。
from math import random
a = 'love'
这种情况下,random和a在同一个命名空间。
命名空间的生存周期
内置的命名空间,在解释器启动之后被创建、从不被删除;
全局的命名空间在模块启动后创建,持续到解释器关闭;
局部的命名空间在函数被调用时启动,函数返回或出现错误时结束;递归调用也如此。
2 作用域(scope)
作用域是一个python程序的文本区域,其中可以直接访问命名空间。
在执行期间的任何时候,至少有三个可直接访问其命名空间的嵌套作用域:
- 首先搜索的作用域为本地名称,local;
- 嵌套作用域,non local,non global;
- 模块的全局名称,global;
- 最外层的是内置的命名空间。
通常情况下,本地名称指的是当前的函数(或类);出了函数,就是模块的全局命名空间;
3 例子
![](https://img.haomeiwen.com/i14201729/193b4ba885301923.png)
可以看出,我们在主函数里面命名了一个spam,它属于non-local变量;
对于do_local函数里面的spam,它优先处理的是局部变量;
对于do_global函数里面的spam,它属于全局变量,无法对non-local变量进行修改。
感想:
- 考虑变量的搜索范围,优先在自己的范围进行搜索;
- 默认对参数的设置为当前范围;如在函数里就是local,在模块里就是global。
- 若函数内对全局变量进行修改,需要声明这个变量就是全局的那个变量,加上global标识符。
参考文献:
Python-tutorial
网友评论