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

Python中字典对象ID为何出现两种不同的缓存表现?

为什么两段打印空字典ID的Python代码结果不同?

先看两段代码的执行差异:

for a in range(2):
    print(id({}))  # 2444803983552, 2444803983552

for a in range(2):
    obj = {}
    print(id(obj))  # 2347467557056, 2347469009408

核心原因是Python对象的引用计数和垃圾回收时机不同:

  • 第一段代码中,每次循环创建的空字典{}没有被任何变量持有引用:id()函数调用结束后,这个字典对象的引用计数直接降为0,Python会立刻回收它占用的内存。当下一次循环再次创建空字典时,系统刚好把刚回收的内存地址分配给新的空字典,所以两次输出的ID完全相同。

  • 第二段代码中,创建的空字典被赋值给了变量obj:在第一次循环结束后,obj依然持有第一个字典的引用,直到第二次循环开始时,obj被重新赋值为新的空字典,此时第一个字典的引用计数才降为0并被回收。但在打印ID时,两次循环创建的字典都处于被引用的存活状态,系统没有来得及复用同一块内存,所以两次输出的ID不同。

补充:这种内存地址复用是Python的优化行为,并非绝对必然——如果两次循环之间有其他操作占用了那块内存,第一段代码的ID也可能出现不同,但在无额外干扰的场景下,大概率会复用地址。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 13:45:11