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
相关产品推荐
相关产品推荐

