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