为什么在 CPython 中空元组、字典和列表共享内存地址?
在 CPython 中,空容器(元组、字典和列表)列表)在其对象标识符方面表现出特殊的行为。具体来说,空元组(如 ())和空字典(如 {})具有相同的内存地址,空列表(如 [])也共享公共地址。
说明
当在 CPython 中调用 id({}) 或 id([]) 时,会创建一个临时容器并将其传递给 id 函数。然而,在函数处理这个临时容器之前,它的内存地址被记录并传递。然后临时容器被丢弃,只留下它的内存地址。
随后,当在创建任何其他容器之前再次调用 id({}) 或 id([]) 时,相同的内存地址很可能会被分配到新的临时容器。 CPython 的内存分配器经常连续分配内存块,因此这种情况的可能性很大。
由于 'id' 函数依赖内存地址来识别对象,因此 id({}) == id({})并且 id([]) == id([]) 成立。这种行为仅发生在这些空容器暂时存在期间,并不表明容器共享任何固有属性。
与可变性的区别
可变性不是直接的造成这一现象的因素。但是,需要注意的是,可变对象(例如列表)不能像不可变对象(例如元组和字符串)一样被缓存或重用。因此,对于任何两个不同的可变对象,id(x) != id(y),即使它们包含相同的元素。
重要性
对象的 ID 是唯一的在其一生中都是独一无二的。一个对象被销毁之后或创建之前,另一个对象可以获得相同的 ID。
以上是为什么空元组、字典和列表在 CPython 中共享内存地址,为什么这与可变性无关?的详细内容。更多信息请关注PHP中文网其他相关文章!