當前位置:
首頁 > 知識 > 詭異的Python整數

詭異的Python整數

詭異的Python整數

注意:所有這些代碼都是使用Python 3.6.1在我的機器上運行的。 如果您使用Python 2進行測試,結果可能會有差異。

詭異的Python整數

這很奇怪! 事實證明,具有相同值的所有「小整數」指向相同的內存地址。 我們可以使用Python內置的函數id,它返回一個可以被認為是要調查的對象的內存地址的值。

詭異的Python整數

看起來存在一個小整數表,每個整數佔32個位元組。

詭異的Python整數

看起來不在小整數表中的整數也佔用32個位元組。 通過id函數返回的值比小整數表中同樣操作的返回值大很多,這意味著它們被存儲在別的地方。

詭異的Python整數

編輯整數?

如果我們更改此表中整數的值會發生什麼? Python有一個名為ctypes的模塊,可以被用來直接編輯內存。 (我們也可以使用調試器,但是通過ctypes模塊,我們可以得到很多用Python寫的例子。)

注意:這個代碼非常依賴平台。 如果它不工作,你可能正在使用Python 2而不是Python 3.在Python 2中,更改mutate_int,以便24和16的這兩個實例都可以工作。

詭異的Python整數

上面的例子不僅更改了a_number和another_number,而是所有指向7的引用:

詭異的Python整數

即使使用7做數學計算也已不再正常。

詭異的Python整數

附: 您可以在CPython源代碼中閱讀有關小整數表的更多信息。


英文原文:https://kate.io/blog/2017/08/22/weird-python-integers/ 譯者:LJ

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 Python部落 的精彩文章:

機器學習入門課今日9折,機不可失
用Python實現鏈表
魯棒有效的日誌工具:logzero,支持Python2 & Python3
你想要的Python软件不支持Windows?来这里找支持版!
Uploadcare如何构建每天处理350M文件API请求的服务堆栈

TAG:Python部落 |