gpt4 book ai didi

python - 为什么Python中的id函数对不同的整型对象返回相同的值?

转载 作者:行者123 更新时间:2023-12-02 17:56:56 25 4
gpt4 key购买 nike

我有一个使用 ctypes 模块在 Python 中检索对象的函数:

import ctypes

def object_at_addr(obj_addr):
try:
val = ctypes.cast(obj_addr, ctypes.py_object).value
except:
return None
return val

我知道对象的 id 显示对象所在的内存地址(就我所见的内置对象和自定义对象而言,大部分是这样)。在我的终端 shell 上,我对数字 0 进行了尝试,然后“递归地”找到每个数字的 id 以查看它是否以某种形式循环。这是终端输出:

>>> id(0) # num1
4343595216
>>> id(4343595216) # num2
4344636112
>>> id(4344636112) # num3
4344636112

令我惊讶的是,两个数字的 id 是相同的。然而,当我使用我的函数并调用 object_at_addr(4344636112) 时,它没有指向任何一个数字,而是返回了一个不同的 int 值,如下所示:

>>> object_at_addr(4344636112)
4411205344

两个不同的数字如何具有相同的id值? id 函数实际上是返回所有对象的内存地址,还是仅针对自定义对象,或者仅仅是 Python 设计选择使内存地址成为 id一个对象,但内置对象不同吗?

最佳答案

id 始终是 CPython 实现中的内存地址。您在这里看到具有相同 id 的数字的原因是可以重复使用内存地址。 id 只保证在对象的生命周期内是唯一的,并且由于没有其他东西持有对整数 4343595216 的引用,它在函数调用返回后立即被删除.该内存位置被释放,然后立即被整数 4344636112 实例重用。

docs实际上明确提到这一点:

Two objects with non-overlapping lifetimes may have the same id() value.

关于python - 为什么Python中的id函数对不同的整型对象返回相同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75424530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com