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

标签 python python-3.x memory-address

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

相关文章:

python - 每次求和通过某个阈值时如何重新采样?

python-3.x - Python 证书验证失败 : unable to get local issuer certificate

c++ - 如何将整个 C++ 命名空间放置在特定的内存位置?

Python 2.x 返回 cmp 的值

python - Jupyter笔记本: How to set matplotlib figure default size persistently,甚至在 `from matplotlib import pyplot`之后?

python - 将隐藏数据插入组合框pyqt

python - 访问类型为 Union 的变量的属性会引发错误

c - buf(main函数中的局部变量)的地址是多少?

assembly - 有没有办法获取寄存器的地址?

python - 执行使用 Python 定义环境变量的 bash 脚本