前后历时近一个月,终于把python解释器研究了一遍,深感“事有本末,物有终始,知所先后则近道矣”。有些知识是源头的,一旦打通,近乎神功。最后把平时的笔记列于下。
- 名字空间:一个名字能够施加影响的程序正文区域,便是该名字的 作用域。在 Python 中,变量只是一个与实际对象绑定起来的名字,变量定义本质上就是建立名字与对象的约束关系。模块的 属性空间 以及 全局名字空间 是同一个东西,都藏身于同一个 dict 对象。
- 全局名字空间:在 Python 中,一个对象可以访问哪些属性,称为对象的 属性空间 。由于属性也是键值对,因此一般也是用 dict 来存储。通过观察以上代码行为,我们得到一个结论:模块的 属性空间 以及 全局名字空间 是同一个东西,都藏身于同一个 dict 对象。那么,我们怎么找到这个特殊的 dict对象呢?答案是:全局名字空间藏身于模块对象背后的 dict 对象中。
- 模块导入:(1)Python 加载模块前,先检查 sys.modules ;如果发现目标模块已经加载过,则直接将其返回。因此,一个模块不管被多少 import 语句导入,第一次加载后便不再重复加载了。想要加载被导入模块,Python 需要找到模块代码的具体位置,这便是 Python 模块搜索 过程。Python 在内部维护了一个模块搜索路径的列表,同样位于 sys 模块内。(2)import中,有计算机设计的思想:比如用空间解决时间,维护一个sys.modules,可以加快访问速度,不需要去查找。还有编译过的文件存入到pyc,不用每次都重新编译,这是把耗时间操作提前的设计思想。python解释器中,按照继承类向上查找的过程,也用到这种思想。通过一个有向图来向上查找继承类。