有可能在 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() 对内存的处理方式。 (通常它会保持不变,因为没有理由将其归零并且这样做需要时间。调试版本可能会将特殊值写入该内存,因为它有助于检测内存损坏。)
在下面,我可以看到当在 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() 对内存的处理方式。 (通常它会保持不变,因为没有理由将其归零并且这样做需要时间。调试版本可能会将特殊值写入该内存,因为它有助于检测内存损坏。)