周梦晗诡异的Python整数-Python程序员
周梦晗诡异的Python整数-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源代码中阅读有关小整数表的更多信息。
英文原文: 译者:LJ