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

Python中不同整数id为何相同?id函数是否返回真实内存地址?

Python中id函数与整数对象的疑问

问题描述

我用ctypes写了一个获取指定内存地址对应Python对象的函数:

import ctypes

def object_at_addr(obj_addr):
    try:
        val = ctypes.cast(obj_addr, ctypes.py_object).value
    except:
        return None
    return val

我原本认为id()返回的是对象的内存地址,但在终端实验中发现了奇怪的现象:

>>> id(0) # num1
4343595216
>>> id(4343595216) # num2
4344636112
>>> id(4344636112) # num3
4344636112 

不同整数的id居然相同,而且调用object_at_addr(4344636112)返回了另一个整数4411205344。想知道为什么不同整数id会相同?id()函数是否对所有对象都返回内存地址,还是内置对象有特殊处理?

解答

  1. CPython中id()的本质
    在CPython解释器中,id(obj)确实返回对象在内存中的地址,不存在针对内置对象的特殊例外规则。

  2. 大整数id重复的原因
    Python会对-5到256之间的小整数做全局缓存(小整数池),这些整数的对象会被复用,所以id固定。但超出这个范围的大整数,Python会临时创建对象,一旦对象没有被任何变量引用,就会被垃圾回收机制立即释放内存。
    你实验中两次id(4344636112)返回相同值,是因为第一次创建的4344636112对象在id()调用结束后没有被引用,内存被释放;第二次创建相同值的整数时,Python复用了之前释放的内存地址,导致两次id相同。

  3. object_at_addr返回异常值的原因
    当你执行id(4344636112)后,这个临时整数对象已经被回收,对应的内存地址被重新分配给了其他对象(也就是你看到的4411205344)。此时用ctypes访问该地址,自然会得到新的对象。
    如果要验证函数正确性,可以先把整数赋值给变量,让对象持有引用避免被回收:

a = 4344636112
addr = id(a)
print(object_at_addr(addr))  # 此时会正确返回4344636112

内容的提问来源于stack exchange,提问作者succulentz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 13:17:32