最近看了《python源码剖析》,把印象深刻的点写下来。自己的体会:只有深入源码,才能理解python中某些概念的本质。
关于python作用域:
文本作用域,编译器都是通过换行来区分的,比如模块对象,类对象,函数对象,它们都对应着一个代码对象。这个代码对象有它维护的环境。
关于赋值:
什么是赋值,其实就是把一个变量和一个对象绑定起来。在python中,变量只是一个名字而已。它可以随意和一个对象绑定起来。所以python中,不光=号,import, as, def class,这些背后都是赋值。本质都是把一个变量和一个对象绑定,对象可以是一个函数体,可以是一个常量。
python虚拟机运行的原理
每个作用域对应一个代码对象,这个对象里有虚拟机代码要用到的常量,变量。还有“机器”代码本身。虚拟机每调用一次函数,就要把代码对象压入虚拟机的栈中。每个代码对象就是一个栈帧,每个栈帧都有自己的作用域。当运行到最里面的函数时,碰到return返回数据,数据从当前栈帧的数据栈中弹出,同时当前栈帧从虚拟机中弹出。当前环境变成下面一个栈帧。并且把return的值传给当前栈帧的一个变量。然后用这个变量代入当前栈帧的代码对象去运算。如果有返回值,继续弹出。这样直到main函数。
背后的思想:虚拟机其实要解决哪些问题呢?首先是管理作用域的问题。如果用python来写,可以用对象来管理每个栈帧。每个对象都可以维护自己的数据变量。而用C语言实现的话,就要借用结构体。还有就是栈这种数据结构。在python中没有专门的栈这种数据模型,强以通过列表实现。