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中文网其他相关文章!