PyObject 能访问 PyLongObject 内容么

2020-08-03 12:43:56 +08:00
 baishuigansijun

PyLongObject 头部信息是一个 PyVarObject,PyObject能访问到引用次数和类型信息,那 PyObject能不能访问到 PyLongObject 所维护的真实 int 值

1435 次点击
所在节点    Python
4 条回复
fasionchan
2020-08-03 15:08:26 +08:00
如果你确定它是一个 PyLongObject,那么你可以将 PyObject 指针强制转换成 PyLongObject 指针,这样就能访问了。另外,PyLongObject 里面不是保存一个 int 值,而是通过 int 数组实现的大整数,它的表示访问比 int 大的多。

我写的《 Python 源码剖析》专栏中有两个下节专门介绍这个:

- int 对象,永不溢出的整数
- int 源码解析:如何实现大整数运算?

有兴趣可以看看,地址是: https://www.imooc.com/read/76
baishuigansijun
2020-08-03 16:34:00 +08:00
@fasionchan 我一直不理解这段话,在 Python 中,而所有的对象都拥有 PyObject,这就使得在 Python 中,对"对象"的引用变得非常统一,我们只需要一个 PyObject *就可以引用任意一个对象,而不需要管这个对象实际是一个什么对象。所以在 Python 中,所有的变量、以及容器内部的元素,本质上都是一个 PyObject *。这个引用指的是 PyObject*可以替代 PyxxxObject*么,可以通过 PyObject*获取 type 信息然后能获取到 PyxxxObject 中的除了引用计数和 type 信息之外的信息不?
sujin190
2020-08-03 18:55:32 +08:00
@baishuigansijun #2 本来就是这样,先判断类型,依据类型转换成对应类型指针,接着就该干嘛干嘛了啊,c 学的不扎实啊,不止 python 这么干,你可以研究研究其他类型语言,底层差不多都是这么干的
ruanimal
2020-08-04 09:51:01 +08:00
@baishuigansijun PyObject 就是 C 代码了,跟 Python 关系不大了,只要你找到内存位置,可以直接 cast 啊。

要剖析 c 的实现,看《 Python 源码剖析》这本书

ps: 不清楚这书和 1 楼的课程有啥关系

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/695220

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX