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

Python函数内创建对象id相同、函数外创建对象id不同原因求解

现象原因解释

这个现象是CPython解释器的内存回收与复用机制导致的,和对象创建在函数内部/外部没有必然关联,核心逻辑和Python的引用计数规则直接相关:

  • CPython中,id() 函数返回的是对象在内存中的起始地址,只要对象被销毁、对应内存被释放,该地址就可以被后续新建的对象复用。

函数内调用返回相同id的原因

你定义的check()函数中,创建的Node实例仅被函数内部的局部变量obj引用:

  1. 第一次调用check():创建Node实例→打印id→函数执行结束后,局部变量obj被回收,该Node实例的引用计数归零,占用的内存被释放回CPython的内存池。
  2. 第二次调用check():新建的Node实例需要的内存大小和刚释放的内存完全匹配,解释器直接把刚回收的内存地址分配给了新实例,因此两次打印的id完全一致。

全局作用域返回不同id的原因

你在全局作用域创建的obj1、obj2两个实例,分别被全局变量持有引用,只要没有手动删除变量、或者变量超出作用域,两个对象的引用计数始终大于0,内存不会被释放,自然不会出现地址复用的情况,因此两个id各不相同。

你可以通过下面的代码验证逻辑:在全局作用域手动销毁前一个对象,也会得到相同的id:

class Node:
    pass

obj1 = Node()
print(id(obj1))
del obj1 # 手动删除引用,触发对象销毁、内存释放
obj2 = Node()
print(id(obj2))

注意:该行为是CPython的实现细节,并非Python语法的强制规范,其他Python解释器(如PyPy)可能表现不同,业务代码绝对不能依赖id复用的特性编写逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 05:45:07