簡體   English   中英

可以在 python 中獲得“地址值”嗎?

[英]Possible to get “value of address” in python?

In the following, I can see that when adding an integer in python, it adds the integer, assigns that resultant value to a new memory address and then sets the variable to point to that memory address:

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

有沒有辦法查看(舊)memory 地址 4304852448 (0x10096d5e0) 的值是多少? 例如: value_of(0x10096d5e0)

您正在嘗試取消引用 memory 地址,就像 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)

OUTPUT:

140489243334080 :  100
140489243334240 :  105
100

上面的示例確定存儲在 a 的先前地址中a值保持不變。

希望這能回答這個問題。 閱讀@Karl 的答案,了解有關后台發生的事情的更多信息 - https://stackoverflow.com/a/58468810/2650341

它添加 integer,將該結果值分配給新的 memory 地址

不; 表示結果值的 object具有不同的 memory 地址。 通常,此 object 是動態創建的,但專門針對整數(不可變,以及應用類似優化的一些其他類型),object 可能已經存在並可以重復使用。

有沒有辦法查看(舊)memory 地址 4304852448 (0x10096d5e0) 的值是多少?

這個問題不好提出。 首先,在這種情況下,“內存地址”是虛擬化的,可能不止一次。 其次,在 Python model 中,地址沒有“值”。 它們可能是對象的位置,而對象又代表值。

也就是說:在前一個id(a)的位置,舊的 object 仍然存在,當且僅當它沒有被垃圾收集時。 為此,保留對 object 的一些其他參考就足夠了。 (垃圾收集的時間是實現定義的,但是參考 CPython 實現是通過引用計數來實現垃圾收集的。)

通常,您無權直接檢查底層 memory (除非可能具有某種具有適當權限的進程間諜),因為 Python 並不是一種低級語言。 (正如@xprilion 的回答,CPython 實現通過ctypes提供了一個較低級別的 memory 接口;但是,那里的代碼實際上是在進行不安全的轉換。)

如果你這樣做了(假設是 CPython),你將不會在第一次調用id(a)指示的 memory 位置中看到 integer 100的二進制表示 - 你會看到用於實現對象的PyObject結構的第一個字在 C 代碼中,(如果我沒看錯的 )將是指向下一個活動堆 object 的指針(全部連接在一個雙向鏈表中)。

一旦它被垃圾收集,memory 的內容再次未定義。 它們取決於實現,甚至專門針對 C 實現,它們取決於標准庫 free() 對 memory 的作用。 (通常它會保持不變,因為沒有理由將其歸零並且這樣做需要時間。調試版本可能會將特殊值寫入 memory,因為它有助於檢測 memory 損壞。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM