资讯动态

Python id()函数怎么用_获取对象内存地址与同一性比较

发布时间:2026/9/12 20:32:37 来源:尧图企业网站定制
id() 返回对象在内存中的唯一标识整数在CPython中是地址但仅当前运行期有效不可用于指针运算主要用于调试、元编程和对象身份快照而非替代is。id() 返回的是什么地址不是 C 语言那种可直接操作的指针id() 返回的是一个整数在 CPython 中它确实是对象在内存中的地址即 object但这个值只对当前运行周期有意义且不同 Python 实现如 PyPy、Jython可能返回其他唯一标识符。它不保证连续、不保证可预测更不能用来做指针运算或传给 ctypes 直接解引用。常见错误现象id(x) id(y) 为 True就以为 x is y 一定成立 —— 实际上如果 x 和 y 是短生命周期的小整数或小字符串CPython 可能复用对象导致 id 碰巧相同但对象已销毁再重建使用场景调试时快速确认两个变量是否指向同一对象实例比如验证缓存命中、单例复用、闭包捕获是否共享性能影响几乎无开销底层就是取对象头里的地址字段什么时候用 id() 比用 is 更合适绝大多数情况下该用 is 就别用 id() —— is 语义清晰、可读性强、且语义等价于 id(a) id(b)在 CPython 中。但有极少数例外想在日志里记录“某对象的唯一标识”又不想暴露 is 的布尔语义比如追踪某个 dict 在多次调用中是否被复用写元编程工具时需要把对象映射到整数键如弱引用字典的 keyid() 提供稳定哈希源注意仍需配合 weakref 防止强引用测试框架中做对象身份快照对比例如 assert id(obj) not in seen_ids避免误判 None 或 False 这类单例小整数和字符串的 id() 为什么看起来“不稳定”CPython 对 [-5, 256] 范围内的整数和部分短字符串做了驻留interning它们在解释器启动时就创建好并复用。但一旦对象被垃圾回收比如局部变量离开作用域再创建同值对象id() 可能重用旧地址 —— 看起来像“变了”其实是新对象恰好分配到了刚释放的内存位置。 Loki.Build AI原生网站构建工具

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价