最近看了《 python 源码分析》,里面提到了 python 的小整数对象池和大整数对象池,然后我发现,如果我在解释器上直接运行:
>>> a = 10000
>>> b = 10000
那么 id(a)
和 id(b)
是不一样的。
但是如果我写个main.py
去跑,那么id(a)
和id(b)
又是一样的了,是因为交互解释器没有用到大整数对象池吗?还是因为 py 文件在编译的时候做了优化?
1
zhuangzhuang1988 2016-12-10 11:42:57 +08:00
如果我没猜错的话, 模块里面应该是 const 值, 然后 a,b 都指向这个
而在 repl 的时候, 每次都是创建的, repl 中不识别出 1000 是 const |
2
herozem 2016-12-10 17:01:03 +08:00
https://github.com/jiajunhuang/cpython/blob/python_source_analysis/Objects/intobject.c#L83-L117
我也在看。不过很奇怪的是,这段代码里并没有根据值去寻找已存在的大整数。所以按照代码来看应该是就算是数值 相同的两个大整数,应该是每次都返回不同的地址才对。 |
3
glogo 2016-12-10 17:12:27 +08:00
这个问题应该是楼主问的吧, https://segmentfault.com/q/1010000007756407
答案 R 大给出了一个 |