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
    。(对象标识表示之间的比较)
  • 根据报告:

    “is”运算符比较两个对象的标识;函数的作用是:返回一个表示其标识的整数

    给定情况(1),对象
    ()
    与对象
    ()
    具有相同的标识(内存地址);但在案例(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