这里有一个网上非常有名的例子:>>>a=256>>>b=256>>>aisbTrue>>>a=257>>>b=257>>>a为bFalse>>>a=257;b=257>>>aisbTrueis和==的区别is运算符检查两个操作数是否引用同一个对象(即检查两个操作数是否相同)==运算符比较值是否两个操作数相等,sois表示引用相同,==表示值相等。下面的例子可以很好地说明这一点:>>>[]==[]True>>>[]is[]#这两个空列表位于不同的内存地址。False256是已经存在的对象,而257不是在你启动Python的时候,值从-5到256的对象已经分配好了。这些数字是预先准备好的,因为它们经常被使用。Python通过这种方式创建小整数池,避免了对小整数内存空间的频繁申请和破坏。引用自https://docs.python.org/3/c-a...当前的实现为-5到256之间的所有整数保留了一个整数对象数组,当您在该范围内创建一个整数时,您只需要返回对现有对象的引用。所以改变1的值是可能的。我怀疑这种行为在Python中是未定义的行为。:-)>>>id(256)10922528>>>a=256>>>b=256>>>id(a)10922528>>>id(b)10922528>>>id(257)140084850247312>>>x=257>>>y=257>>>id(x)140084850247440>>>id(y)140084850247344这里的解释器不够聪明,无法执行y=257意识到我们已经创建了一个整数257,所以它创建了另一个内存中的对象。当a和b在同一行用相同的值初始化时,它们指向同一个对象。>>>a,b=257,257>>>id(a)140640774013296>>>id(b)140640774013296>>>a=257>>>b=257>>>id(a)140640774013392>>>id(b)140640774013488当a和b在同一行设置为257时,Python解释器创建一个新对象,然后同时引用第二个变量。如果您在不同的行上执行此操作,它不会“知道”257对象已经存在。这是专门针对交互式环境进行的编译器优化。当您在实时解释器中键入两行代码时,它们会分别编译,因此会分别进行优化。如果您在.py文件中尝试此示例,您将不会看到相同的行为,因为该文件是一次性编译的。文渊网络仅供学习使用,如有侵权,请联系删除。我的公众号【Python圈】汇集了优质的技术文章和经验总结。学习Python的路上肯定会遇到困难,不要慌张,我这里有一套学习资料,包括40+电子书,600+教学视频,涉及Python基础、爬虫、框架、数据分析、机学习等等,别怕学不会!还有学习交流群,一起学习进步~
