2 回答

TA貢獻(xiàn)1826條經(jīng)驗(yàn) 獲得超6個(gè)贊
它添加整數(shù),將結(jié)果值分配給新的內(nèi)存地址
不; 表示結(jié)果值的對象具有不同的內(nèi)存地址。通常,此對象是動(dòng)態(tài)創(chuàng)建的,但特別是對于整數(shù)(不可變,并且對于應(yīng)用類似優(yōu)化的某些其他類型),該對象可能已經(jīng)存在并可以重用。
有沒有辦法查看(舊)內(nèi)存地址 4304852448 (0x10096d5e0) 處的值是什么?
這個(gè)問題不好提出。首先,在這種情況下,“內(nèi)存地址”是虛擬化的,可能不止一次。其次,在 Python 模型中,地址沒有“值”。它們可能是對象的位置,而對象又代表值。
也就是說:在 previous 的位置,id(a)
當(dāng)且僅當(dāng)它沒有被垃圾收集時(shí),舊對象仍然存在。為此,保留對該對象的一些其他引用就足夠了。(垃圾收集的時(shí)間是實(shí)現(xiàn)定義的,但是參考 CPython 實(shí)現(xiàn)是通過引用計(jì)數(shù)來實(shí)現(xiàn)垃圾收集的。)
通常,您無權(quán)直接檢查底層內(nèi)存(可能除了具有適當(dāng)權(quán)限的某種進(jìn)程間諜),因?yàn)?Python 并不是一種低級語言。(正如@xprilion 的回答,CPython 實(shí)現(xiàn)通過 提供了一個(gè)較低級別的內(nèi)存接口ctypes
;但是,那里的代碼實(shí)際上是在進(jìn)行不安全的轉(zhuǎn)換。)
如果你這樣做了(假設(shè)是 CPython),你將不會(huì)100
在第一次調(diào)用所指示的內(nèi)存位置中看到整數(shù)的二進(jìn)制表示id(a)
- 你會(huì)看到PyObject
用于在 C 代碼中實(shí)現(xiàn)對象的結(jié)構(gòu)的第一個(gè)字,它(如果我沒看錯(cuò)的話)將是一個(gè)指向下一個(gè)活動(dòng)堆對象的指針(全部連接在一個(gè)雙向鏈表中)。
一旦它被垃圾收集,該內(nèi)存的內(nèi)容再次未定義。它們依賴于實(shí)現(xiàn),甚至專門針對 C 實(shí)現(xiàn),它們依賴于標(biāo)準(zhǔn)庫 free() 對內(nèi)存的處理。(通常它會(huì)保持不變,因?yàn)闆]有理由將其歸零并且這樣做需要時(shí)間。調(diào)試構(gòu)建可能會(huì)將特殊值寫入該內(nèi)存,因?yàn)樗兄跈z測內(nèi)存損壞。)

TA貢獻(xiàn)1946條經(jīng)驗(yàn) 獲得超3個(gè)贊
您正在嘗試取消引用內(nèi)存地址,就像 C/C++ 中使用的指針一樣。以下代碼可能會(huì)對您有所幫助 -
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
上面的示例確定存儲(chǔ)在 的先前地址中的值a保持不變。
添加回答
舉報(bào)