为什么 CPython 中 `id({}) == id({})` 和 `id([]) == id([])` 返回 True?

Mary-Kate Olsen
发布: 2024-10-30 04:11:03
原创
272 人浏览过

Why do `id({}) == id({})` and `id([]) == id([])` return True in CPython?

CPython 中的唯一对象标识符:为什么 id({}) == id({}) 和 id([]) == id([])

CPython 的 id() 函数为对象分配唯一标识符,但这种唯一性仅限于对象的生命周期。当对象被销毁时,它们的标识符就可以重用。

考虑以下行为:

<code class="python">tuple1 = ()
tuple2 = ()                                                                                                   
dict1 = {}
dict2 = {}
list1 = []
list2 = []
# makes sense, tuples are immutable
assert(id(tuple1) == id(tuple2))
# also makes sense dicts are mutable
assert(id(dict1) != id(dict2))
# lists are mutable too
assert(id(list1) != id(list2))
assert(id(()) == id(()))
# why no assertion error on this?
assert(id({}) == id({}))
# or this?
assert(id([]) == id([]))</code>
登录后复制

为什么 id({}) == id({}) 和 id([ ]) == id([]) return True?

CPython 的内存分配

这些断言成功是因为 CPython 的内存分配机制。当 id({}) 时,CPython 分配一个字典,将其内存地址传递给 id(),然后丢弃该字典。当再次调用时,CPython 会找到一个空闲内存块并重用相同的地址。可变性不会直接影响此行为。

代码对象缓存

代码对象缓存特定函数、类或模块中使用的元组和字符串。如果相同的文字(整数、字符串或特定元组)出现多次,则重复使用同一个对象。可变对象总是在运行时创建,防止重用。

结论

因此,CPython 中对象的 id 仅在其生命周期内是唯一的。一旦一个对象被销毁,它的id就可以被其他对象重用。这解释了在提供的代码片段中观察到的行为。

以上是为什么 CPython 中 `id({}) == id({})` 和 `id([]) == id([])` 返回 True?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!