为什么空元组、字典和列表在 CPython 中共享内存地址,为什么这与可变性无关?

Patricia Arquette
发布: 2024-10-31 09:51:29
原创
525 人浏览过

Why do empty tuples, dictionaries, and lists share memory addresses in CPython, and why is this not related to mutability?

为什么在 CPython 中空元组、字典和列表共享内存地址?

在 CPython 中,空容器(元组、字典和列表)列表)在其对象标识符方面表现出特殊的行为。具体来说,空元组(如 ())和空字典(如 {})具有相同的内存地址,空列表(如 [])也共享公共地址。

说明

当在 CPython 中调用 id({}) 或 id([]) 时,会创建一个临时容器并将其传递给 id 函数。然而,在函数处理这个临时容器之前,它的内存地址被记录并传递。然后临时容器被丢弃,只留下它的内存地址。

随后,当在创建任何其他容器之前再次调用 id({}) 或 id([]) 时,相同的内存地址很可能会被分配到新的临时容器。 CPython 的内存分配器经常连续分配内存块,因此这种情况的可能性很大。

由于 'id' 函数依赖内存地址来识别对象,因此 id({}) == id({})并且 id([]) == id([]) 成立。这种行为仅发生在这些空容器暂时存在期间,并不表明容器共享任何固有属性。

与可变性的区别

可变性不是直接的造成这一现象的因素。但是,需要注意的是,可变对象(例如列表)不能像不可变对象(例如元组和字符串)一样被缓存或重用。因此,对于任何两个不同的可变对象,id(x) != id(y),即使它们包含相同的元素。

重要性

对象的 ID 是唯一的在其一生中都是独一无二的。一个对象被销毁之后或创建之前,另一个对象可以获得相同的 ID。

以上是为什么空元组、字典和列表在 CPython 中共享内存地址,为什么这与可变性无关?的详细内容。更多信息请关注PHP中文网其他相关文章!

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