我正在研究一篇文章,我从Python文档中找到了一个非常有趣的引述:Thecurrentimplementationreservesforallintegersbetween-5and256整数对象数组,当您在该范围内创建一个int时,您实际上返回了对现有对象的引用。所以应该可以更改1的值。我怀疑Python在这种情况下的行为是未定义的。Python中的一切都是对象——包括数字。这很重要,因为数字-5...256是在运行时分配的,访问它们会返回对对象的引用,从而允许您永久更改这些数字的值(在Python实例中)。现在我不知道它有多少实际用途,但它肯定很有趣。要热身,您需要一些基本的C知识和ctypes库。首先更改一个相对不用的数字的值,比如31:>>>importctypes>>>defchangeNum(oldNum,newNum):...ctypes.cast(id(oldNum),ctypes.POINTER(ctypes.c_int))[6]=newNum>>>changeNum(31,100)#changes31to100>>>31100让我们尝试一些基本的算法:>>>31+31200>>>31**0.510.0>>>31**210000这个输出让我感到非常不舒服,如果您有同样的感觉,请为发生的事情感到抱歉。现在,让我们实际运行手套:>>>31==100True>>>changeNum(100,200)>>>31100>>>100200>>>31==100False>>>31==200False>>>31*2==200True>>>31*2==100True改值后消失。您可以尝试取回原始值,但它已被删除。>>>changeNum(100,500//5)>>>100200>>>changeNum(100,50*2)>>>100200绝对的迷惑如果你还没有意识到,对象本身就在做全局变化。这意味着与该号码的任何交互都是“未定义的”。让我们看看如何在for循环中“定义”行为:>>>changeNum(5,100)>>>foriinrange(5):...print(i)...012...99是非常标准的;as一个不一致的数制可以得到标准。越来越奇怪:如果我更改5的值,从技术上讲,5将不再存在。这导致在基本操作中出现非常奇怪的交互:>>>changeNum(5,20)>>>5-7==13True>>>5-7-8==5True如果你真的想伤脑筋,麻烦你了与其他一些数字一起做一些数学运算:>>>changeNum(29,100)>>>changeNum(5,20)>>>changeNum(120,200)>>>5+9100>>>5+9+5200>>>5+9+5+5220>>>(5+9)*52000你也可以做一个非常混乱的无限while循环:>>>while5//4==5:...pass。..#Doloopstuff让Python崩溃我们现在去钓鱼吧;我们已经解决了其他不重要的数字,但是如果我们改变1会发生什么?>>>changeNum(1,2)>>>1Segmentationfault(coredumped)它崩溃了。这并不奇怪,因为1是一个非常重要的数字,用于非常重要的计算。我不确定更改1是否会影响True,但如果确实如此,我可以想象后果。最后的话Python很棒,尽管这些交互很丑陋,但我仍然觉得它们很酷,希望你也这样做。您可以用它来恶作剧朋友或同事,并在他们试图弄清楚为什么5不是5时把他们逼疯。如果没有这个Reddit线程和令人惊叹的GitHub存储库,我就不可能发表这篇文章,我强烈建议您查看一下。谢谢你陪我度过这段时间。
