首页 > 解决方案 > ctype.c_long.from_address 为某些输入返回随机值

问题描述

请参阅此代码:

>>> import ctypes
>>> x=12345
>>> y=x
>>> ctypes.c_long.from_address(id(x)).value
2
>>> a=2
>>> b=a
>>> ctypes.c_long.from_address(id(a)).value
116
>>>

对于对象 x,它返回了预期的输出,但对于“a”,它返回了一个意外的结果

标签: python-3.xctypes

解决方案


“预期值”是已分配对象的引用计数。

分配时x,您分配了一个新int对象。您获取了另一个引用,并且毫不惊讶地看到 refcount 增加了 1。

当您分配 时a,您对现有对象进行了引用。cPython 解释器预先创建了一个包含 200 多个小整数的缓存,然后您import编辑的模块会引用其中的一些。您的示例输出只是说现存有一百多个引用,参见解释器维护的整数缓存是什么?.


推荐阅读