PyLongObject 头部信息是一个 PyVarObject,PyObject能访问到引用次数和类型信息,那 PyObject能不能访问到 PyLongObject 所维护的真实 int 值
1
fasionchan 2020-08-03 15:08:26 +08:00 1
如果你确定它是一个 PyLongObject,那么你可以将 PyObject 指针强制转换成 PyLongObject 指针,这样就能访问了。另外,PyLongObject 里面不是保存一个 int 值,而是通过 int 数组实现的大整数,它的表示访问比 int 大的多。
我写的《 Python 源码剖析》专栏中有两个下节专门介绍这个: - int 对象,永不溢出的整数 - int 源码解析:如何实现大整数运算? 有兴趣可以看看,地址是: https://www.imooc.com/read/76 |
2
baishuigansijun OP @fasionchan 我一直不理解这段话,在 Python 中,而所有的对象都拥有 PyObject,这就使得在 Python 中,对"对象"的引用变得非常统一,我们只需要一个 PyObject *就可以引用任意一个对象,而不需要管这个对象实际是一个什么对象。所以在 Python 中,所有的变量、以及容器内部的元素,本质上都是一个 PyObject *。这个引用指的是 PyObject*可以替代 PyxxxObject*么,可以通过 PyObject*获取 type 信息然后能获取到 PyxxxObject 中的除了引用计数和 type 信息之外的信息不?
|
3
sujin190 2020-08-03 18:55:32 +08:00
@baishuigansijun #2 本来就是这样,先判断类型,依据类型转换成对应类型指针,接着就该干嘛干嘛了啊,c 学的不扎实啊,不止 python 这么干,你可以研究研究其他类型语言,底层差不多都是这么干的
|
4
ruanimal 2020-08-04 09:51:01 +08:00
@baishuigansijun PyObject 就是 C 代码了,跟 Python 关系不大了,只要你找到内存位置,可以直接 cast 啊。
要剖析 c 的实现,看《 Python 源码剖析》这本书 ps: 不清楚这书和 1 楼的课程有啥关系 |