为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

BIG阳 2022-06-28 17:05:44
在下文中,我可以看到在 python 中添加整数时,它会添加整数,将结果值分配给新的内存地址,然后将变量设置为指向该内存地址:>>> a=100>>> id(a)4304852448>>> a+=5>>> id(a)4304852608有没有办法查看(旧)内存地址 4304852448 (0x10096d5e0) 处的值是什么?例如:value_of(0x10096d5e0)
查看完整描述

2 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

它添加整数,将结果值分配给新的内存地址

不; 表示结果值的对象具有不同的内存地址。通常,此对象是动态创建的,但特别是对于整数(不可变,并且对于应用类似优化的某些其他类型),该对象可能已经存在并可以重用。

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

这个问题不好提出。首先,在这种情况下,“内存地址”是虚拟化的,可能不止一次。其次,在 Python 模型中,地址没有“值”。它们可能是对象的位置,而对象又代表值。

也就是说:在 previous 的位置,id(a)当且仅当它没有被垃圾收集时,旧对象仍然存在。为此,保留对该对象的一些其他引用就足够了。(垃圾收集的时间是实现定义的,但是参考 CPython 实现是通过引用计数来实现垃圾收集的。)

通常,您无权直接检查底层内存(可能除了具有适当权限的某种进程间谍),因为 Python 并不是一种低级语言。(正如@xprilion 的回答,CPython 实现通过 提供了一个较低级别的内存接口ctypes;但是,那里的代码实际上是在进行不安全的转换。)

如果你这样做了(假设是 CPython),你将不会100在第一次调用所指示的内存位置中看到整数的二进制表示id(a)- 你会看到PyObject用于在 C 代码中实现对象的结构的第一个字,它(如果我没看错的)将是一个指向下一个活动堆对象的指针(全部连接在一个双向链表中)。

一旦它被垃圾收集,该内存的内容再次未定义。它们依赖于实现,甚至专门针对 C 实现,它们依赖于标准库 free() 对内存的处理。(通常它会保持不变,因为没有理由将其归零并且这样做需要时间。调试构建可能会将特殊值写入该内存,因为它有助于检测内存损坏。)


查看完整回答
反对 回复 2022-06-28
?
智慧大石

TA贡献1946条经验 获得超3个赞

您正在尝试取消引用内存地址,就像 C/C++ 中使用的指针一样。以下代码可能会对您有所帮助 -


import ctypes


a = 100

b = id(a)


print(b, ": ", a)


a+=5

print(id(a), ": ", a)


print(ctypes.cast(b, ctypes.py_object).value)

输出:

140489243334080 :  100

140489243334240 :  105

100

上面的示例确定存储在 的先前地址中的值a保持不变。


查看完整回答
反对 回复 2022-06-28
  • 2 回答
  • 0 关注
  • 130 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信