Python `is`比较:直接对象比较与对象标识表示的比较
因此,我得到以下结果:Python `is`比较:直接对象比较与对象标识表示的比较,python,python-2.7,Python,Python 2.7,因此,我得到以下结果: ()is()返回True(两个对象之间的比较) id(())是id(())返回False。(对象标识表示之间的比较) 根据报告: “is”运算符比较两个对象的标识;函数的作用是:返回一个表示其标识的整数 给定情况(1),对象()与对象()具有相同的标识(内存地址);但在案例(2)中,它们的身份表示并不完全相同 这是为什么?函数返回一个整数,可以说它代表了一个对象的“身份”。虽然如果两个变量x和y引用同一个对象,x是y成功,并且id(x)的结果等于id(y),但并不意味着这
()is()
返回True
(两个对象之间的比较)id(())是id(())
返回False
。(对象标识表示之间的比较)()
与对象()
具有相同的标识(内存地址);但在案例(2)中,它们的身份表示并不完全相同
这是为什么?函数返回一个整数,可以说它代表了一个对象的“身份”。虽然如果两个变量x
和y
引用同一个对象,x是y
成功,并且id(x)
的结果等于id(y)
,但并不意味着这些整数本身就是同一个对象
因此,您应该使用:
id(()) == id(())
# ^ == not is
因此,您应该将
id
s与id(())==id(())
。。。使用=
而不是is
。因为ID是在内存中存在两次的大整数。CPython中只缓存小整数。@WillemVanOnsem是的,我知道id()
返回整数,但由于它们是同一个对象的表示,所以对它们为什么是不同的对象感到困惑。@timgeb很高兴知道。谢谢@timgeb顺便说一句,你能在下面的答案中加上它吗?这样我就可以投票了?谢谢此外,我还想知道“大”有多大,并且说任何大于256的东西都算大,“因此在某些情况下,一个对象的id(..)可以在两次调用之间更改”。我相当肯定这是错误的:它会破坏id
的全部意义。你有关于这项索赔的任何参考资料吗?@MarkDickinson:对不起,我看错了文件。在对象的生命周期中,id确实需要保持不变。(speedreading的另一方面:()尽管对于某些实现(例如PyPy),关于内存地址可能发生变化的部分是正确的,这意味着PyPy必须跳转才能拥有一个恒定的id
(这当然不是基于内存地址).CPython从不在内存中移动对象,因此使用id
的内存地址是安全的。很酷。感谢您的解释!
>>> 1234567890 is (1234567891-1)
False
>>> 1234567890 == (1234567891-1)
True