詭異的Python整數
注意:所有這些代碼都是使用Python 3.6.1在我的機器上運行的。 如果您使用Python 2進行測試,結果可能會有差異。
這很奇怪! 事實證明,具有相同值的所有「小整數」指向相同的內存地址。 我們可以使用Python內置的函數id,它返回一個可以被認為是要調查的對象的內存地址的值。
看起來存在一個小整數表,每個整數佔32個位元組。
看起來不在小整數表中的整數也佔用32個位元組。 通過id函數返回的值比小整數表中同樣操作的返回值大很多,這意味著它們被存儲在別的地方。
編輯整數?
如果我們更改此表中整數的值會發生什麼? Python有一個名為ctypes的模塊,可以被用來直接編輯內存。 (我們也可以使用調試器,但是通過ctypes模塊,我們可以得到很多用Python寫的例子。)
注意:這個代碼非常依賴平台。 如果它不工作,你可能正在使用Python 2而不是Python 3.在Python 2中,更改mutate_int,以便24和16的這兩個實例都可以工作。
上面的例子不僅更改了a_number和another_number,而是所有指向7的引用:
即使使用7做數學計算也已不再正常。
附: 您可以在CPython源代碼中閱讀有關小整數表的更多信息。
英文原文:https://kate.io/blog/2017/08/22/weird-python-integers/ 譯者:LJ


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