python-3.x - 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”,它返回了一个意外的结果
解决方案
“预期值”是已分配对象的引用计数。
分配时x
,您分配了一个新int
对象。您获取了另一个引用,并且毫不惊讶地看到 refcount 增加了 1。
当您分配 时a
,您对现有对象进行了引用。cPython 解释器预先创建了一个包含 200 多个小整数的缓存,然后您import
编辑的模块会引用其中的一些。您的示例输出只是说现存有一百多个引用,参见解释器维护的整数缓存是什么?.
推荐阅读
- python - 查询 pandas 日期时间并在当前日期、上限和下限 timedelta 之间进行过滤
- mongodb - MongoDB多服务器模式
- javascript - 单击按钮以将项目添加到购物车
- python - 在 Python 中操作不同的方法是否有不同的名称(或分类)?
- node.js - Node.js Exec 未在带有 MAC 的 Visual Studio Code 上运行
- java - 我们可以在子类中修改父成员变量或方法的访问修饰符吗?
- python - 与 MongoDB 搜索相比,在巨大的列表中搜索非常慢
- python - Python Beautifulsoup 找不到 HTML 数据的文本
- powershell - 必须是一种更清洁的方式
- docker - 无法解析主机:Docker for Mac