2 回答

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

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保持不變。
添加回答
舉報