可以在python中获得“地址值”吗?

在下文中,我可以看到在 python 中添加整数时,它会添加整数,将结果值分配给新的内存地址,然后将变量设置为指向该内存地址:


>>> a=100

>>> id(a)

4304852448

>>> a+=5

>>> id(a)

4304852608

有没有办法查看(旧)内存地址 4304852448 (0x10096d5e0) 处的值是什么?例如:value_of(0x10096d5e0)


BIG阳
浏览 131回答 2
2回答

跃然一笑

它添加整数,将结果值分配给新的内存地址不; 表示结果值的对象具有不同的内存地址。通常,此对象是动态创建的,但特别是对于整数(不可变,并且对于应用类似优化的某些其他类型),该对象可能已经存在并可以重用。有没有办法查看(旧)内存地址 4304852448 (0x10096d5e0) 处的值是什么?这个问题不好提出。首先,在这种情况下,“内存地址”是虚拟化的,可能不止一次。其次,在 Python 模型中,地址没有“值”。它们可能是对象的位置,而对象又代表值。也就是说:在 previous 的位置,id(a)当且仅当它没有被垃圾收集时,旧对象仍然存在。为此,保留对该对象的一些其他引用就足够了。(垃圾收集的时间是实现定义的,但是参考 CPython 实现是通过引用计数来实现垃圾收集的。)通常,您无权直接检查底层内存(可能除了具有适当权限的某种进程间谍),因为 Python 并不是一种低级语言。(正如@xprilion 的回答,CPython 实现通过 提供了一个较低级别的内存接口ctypes;但是,那里的代码实际上是在进行不安全的转换。)如果你这样做了(假设是 CPython),你将不会100在第一次调用所指示的内存位置中看到整数的二进制表示id(a)- 你会看到PyObject用于在 C 代码中实现对象的结构的第一个字,它(如果我没看错的话)将是一个指向下一个活动堆对象的指针(全部连接在一个双向链表中)。一旦它被垃圾收集,该内存的内容再次未定义。它们依赖于实现,甚至专门针对 C 实现,它们依赖于标准库 free() 对内存的处理。(通常它会保持不变,因为没有理由将其归零并且这样做需要时间。调试构建可能会将特殊值写入该内存,因为它有助于检测内存损坏。)

智慧大石

您正在尝试取消引用内存地址,就像 C/C++ 中使用的指针一样。以下代码可能会对您有所帮助 -import ctypesa = 100b = id(a)print(b, ": ", a)a+=5print(id(a), ": ", a)print(ctypes.cast(b, ctypes.py_object).value)输出:140489243334080 :  100140489243334240 :  105100上面的示例确定存储在 的先前地址中的值a保持不变。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python