为什么 ctypes.c_long.from_address.value 会产生对象的引用计数?

问题描述 投票:0回答:1

在这次 pycon 会议中,演示者说

ctypes.c_long.from_address(id(SOME_OBJECT)).value
将产生对象的引用计数。 我试图在文档中找到这一点,但没有发现任何对我有帮助的东西。 doc 说:

from_address(地址)

该方法使用地址指定的内存返回一个ctypes类型实例,地址必须是整数。

此方法以及其他间接调用此方法的方法,会引发带有参数地址的审核事件 ctypes.cdata。

它没有提到引用计数(至少我无法弄清楚)。我尝试了一下,这似乎是正确的:

Python 3.13.1 (main, Dec  3 2024, 17:59:52) [Clang 16.0.0 (clang-1600.0.26.4)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import ctypes, sys
>>> name = "some random name 123"
>>> sys.getrefcount(name)
2
>>> ctypes.c_long.from_address(id(name)).value
1
>>> x, y = name, name
>>> sys.getrefcount(name)
4
>>> ctypes.c_long.from_address(id(name)).value
3

有人可以解释一下吗?

python memory ctypes reference-counting
1个回答
0
投票

在 CPython 中,

id(obj)
返回
struct PyObject*
的 C
obj
。该结构的第一个成员是引用计数。 这是一个实施细节。

© www.soinside.com 2019 - 2024. All rights reserved.