周梦晗诡异的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