You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 20:05:23