作者写得很容易让人明白,真是好书。
Python创建一个对象时,比如PyIntObject,会分配内存,进行初始化。然后用一个PyObject *变量,而不是通过PyIntObject* 变量来保存和维护这个对象。在python内部各个函数直接传递的都是泛型指针 PyObject *。指针所指的对象是什么类型的我们不知道,只能从指针所指的对象的ob_type域动态判断(PyTypeObject),python正是通过这个域实现了多态
书上举了Print的例子
void Print(PyObject * object){
object -> ob_type -> tp_print(object)
}
如果传给Print的指针是一个PyIntObject *,从PyObject指针找到ob_type指针再调用类型里对应的输出操作。作者在前面对这几个关键对象做了讲解,这里很好理解。
对象池
数值比较小的整数在程序中会频繁使用,为解决频繁内存申请和释放,使用对象池。对象池里的每一个PyInetObject对象都能够被任意的共享。大整数和小整数的分界点默认设定为[-5,257),修改方式,修改源码重新编译python。
对于大整数对象,python提供一块内存空间,由大整数轮流使用。数量为82个,也可以通过修改源码改变。
PyIntObject创建的过程,如果是小整数对象,则返回在小整数对象池中的对应的对象。如果不是,使用通用整数对象池
可以很容易的理解一些问题:
>>> a1=[1,2,3]
>>> b1=a1
>>> b1 == a1
True
>>> b1 is a1
True
>>> b2 = [1,2,3]
>>> a1 == b2
True
>>> a1 is b2
False
>>> c1=1
>>> c2 = c1
>>> c1 == c2
True
>>> c1 is c2
True
>>> c3 =1
>>> c3 == c1
True
>>> c3 is c1
True
==判定具有相同的值,is判定是同一个对象。A1 b1是对同一个列表的引用,is返回True,a1 b2不是,返回False。下面的c3 c1 返回True,是对同一对象的引用。
上一篇: 编写chrome扩展遇到“即将停止支持清单版本 1。请升级到版本 2。”
下一篇: python源码剖析笔记-字符串
0 Responses so far.