Python内置函数id()输出结构解析及自定义实现相关问询
Python id() 函数与内存地址详解
64位系统下id()输出的13位数字含义
在CPython中,id()返回的是对象虚拟内存地址的十进制表示。64位系统的虚拟地址空间理论上限是2^64,对应十进制最大为20位,但实际中操作系统只会给进程分配部分虚拟地址空间,Python的内存分配器也只会使用其中的特定区域,所以你看到的13位只是当前对象地址转成十进制后的长度——它没有固定的结构意义,只是该虚拟地址的十进制形式,长度会随地址本身变化,并非所有64位系统下的id输出都是13位。
地址的结构与唯一性
- 结构:CPython中,这个地址是对象在堆内存的起始地址(Python绝大多数对象都存在堆中,包括小整数池里的 interned 对象,它们也位于堆的特定区域)。这里的地址是操作系统给进程映射的虚拟地址,和物理RAM的实际地址不直接对应,操作系统会通过内存管理单元(MMU)完成虚拟地址到物理地址的转换。
- 唯一性:对象在生命周期内,其地址是唯一的;当对象被垃圾回收后,该地址可能被重新分配给新对象,但同一时刻内存中的每个对象都有唯一的地址。
自定义实现类似id()的功能
仅适用于CPython实现,可借助ctypes模块直接获取对象的内存地址,代码如下:
import ctypes def get_object_id(obj): # 将Python对象转换为void指针,提取其数值形式的地址 return ctypes.cast(ctypes.py_object(obj), ctypes.c_void_p).value
测试示例:
a = 5 print(get_object_id(a)) # 输出与id(a)完全一致的十进制数字
注意:该实现依赖CPython的底层机制,在PyPy、Jython等其他Python解释器中不适用——这些解释器的id()仅作为对象的唯一标识符,与内存地址无关。
内容的提问来源于stack exchange,提问作者Serdar Gundogdu
相关产品推荐
相关产品推荐

