我有一个使用 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/