亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

可以在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 關注
  • 163 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號