有可能在 python 中获得 "value of address" 吗?

Possible to get "value of address" in python?

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

>>> a=100
>>> id(a)
4304852448
>>> a+=5
>>> id(a)
4304852608

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

您正在尝试取消引用内存地址,就像 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的前一个地址中存储的值保持不变。

希望这能回答问题。阅读@Karl 的回答以获取有关后台发生的事情的更多信息 -

it adds the integer, assigns that resultant value to a new memory address

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

Is there a way to see what the value is at the (old) memory address 4304852448 (0x10096d5e0) is?

这个问题提得不好。首先,"memory addresses" 在这种情况下被虚拟化,可能不止一次。其次,在 Python 模型中,地址不 "have values"。它们可能是对象的位置,而对象又代表值。

就是说:在前一个 id(a) 的位置,当且仅当它没有被垃圾回收时,旧对象仍然存在。为此,持有对该对象的一些其他引用就足够了。 (垃圾回收的时机是实现定义的,但是引用CPython实现是通过引用计数实现垃圾回收的。)

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

如果你这样做了(假设 CPython),你会不会看到整数 100 在由第一次调用 id(a) - 您会看到用于在 C 代码中实现对象的 PyObject 结构的第一个单词,(如果我正确阅读 it)将是指向下一个活动堆对象的指针(全部连接在双向链表中)。

一旦被垃圾回收,该内存的内容又未定义。它们取决于实现,甚至特别是对于 C 实现,它们取决于标准库 free() 对内存的处理方式。 (通常它会保持不变,因为没有理由将其归零并且这样做需要时间。调试版本可能会将特殊值写入该内存,因为它有助于检测内存损坏。)