为了账号安全,请及时绑定邮箱和手机立即绑定

“是”运算符与整数意外行为

“是”运算符与整数意外行为

MYYA 2019-05-22 14:29:59
“是”运算符与整数意外行为为什么以下在Python中出现意外行为?>>> a = 256>>> b = 256>>> a is bTrue           # This is an expected result>>> a = 257>>> b = 257>>> a is bFalse          # What happened here? Why is this False?>>> 257 is 257True           # Yet the literal numbers compare properly我使用的是Python 2.5.2。尝试一些不同版本的Python,似乎Python 2.3.3显示了99到100之间的上述行为。基于以上所述,我可以假设Python在内部实现,使得“小”整数以不同于大整数的方式存储,并且is运算符可以区分。为什么泄漏抽象?当我不知道它们是否是数字时,比较两个任意对象以查看它们是否相同的更好的方法是什么?
查看完整描述

5 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞


看看这个:


>>> a = 256

>>> b = 256

>>> id(a)

9987148

>>> id(b)

9987148

>>> a = 257

>>> b = 257

>>> id(a)

11662816

>>> id(b)

11662828

编辑:这是我在Python 2文档中找到的,“普通整数对象”Python 3也是如此):

当前实现为-5到256之间的所有整数保留一个整数对象数组,当您在该范围内创建一个int时,实际上只返回对现有对象的引用。因此应该可以更改值1.我怀疑在这种情况下Python的行为是未定义的。:-)


查看完整回答
反对 回复 2019-05-22
?
HUWWW

TA贡献1874条经验 获得超12个赞

这取决于你是否想要看两件事是否相同,或者是同一个对象。


is检查它们是否是同一个对象,而不仅仅是相同的。小的int可能指向相同的内存位置以提高空间效率


In [29]: a = 3

In [30]: b = 3

In [31]: id(a)

Out[31]: 500729144

In [32]: id(b)

Out[32]: 500729144

您应该==用来比较任意对象的相等性。您可以使用__eq__和__ne__属性指定行为。


查看完整回答
反对 回复 2019-05-22
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

由于您可以检查源文件intobject.c,因此Python会缓存小整数以提高效率。每次创建对小整数的引用时,都指的是缓存的小整数,而不是新对象。257不是一个小整数,因此它被计算为一个不同的对象。

最好是==为此目的使用。


查看完整回答
反对 回复 2019-05-22
  • 5 回答
  • 0 关注
  • 689 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信