为什么CPython ints是唯一的,而不是很长?

为什么CPython ints是唯一的,而不是很长?,python,identity,python-2.x,Python,Identity,Python 2.x,使用Python2.7,如果我尝试比较两个数字的标识,则对于int和long不会得到相同的结果 int >>> a = 5 >>> b = 5 >>> a is b True long >>> a = 885763521873651287635187653182763581276358172635812763 >>> b = 8857635218736512876351876531827635812763

使用Python2.7,如果我尝试比较两个数字的标识,则对于
int
long
不会得到相同的结果

int

>>> a = 5
>>> b = 5
>>> a is b
True
long

>>> a = 885763521873651287635187653182763581276358172635812763
>>> b = 885763521873651287635187653182763581276358172635812763
>>> a is b
False
我有几个相关的问题:

  • 为什么两者的行为不同
  • 我将此行为推广到所有
    int
    s和所有
    long
    s是否正确
  • 这是特指CPython吗

    • 这在
      int
      long
      之间没有区别。CPython实习小整数(从
      -5
      256


      尝试这种方法,然后您将能够比较数据

      a = 885763521873651287635187653182763581276358172635812763
      b = 885763521873651287635187653182763581276358172635812763
      if a == b:
       print 'both are same'
      
      然后你会得到结果

      both are same
      
      为什么两者的行为不同? 在CPython中创建新值时,实际上是创建一个包含该值的整个新对象。对于较小的整数值(从-5到256),CPython决定重用先前创建的旧对象。这被称为“实习”,这是出于性能原因——人们认为,保留旧对象比创建新对象更便宜

      我将这种行为推广到所有整数和所有长整数,对吗? 不,正如我所说,它只发生在小整数。短字符串也会发生这种情况。(其中short表示少于7个字符。)不要依赖于此。它仅用于性能原因,并且您的程序不应依赖于值的插入

      这是特指CPython吗? 一点也不。尽管具体情况可能有所不同,但许多其他平台都会进行实习。在这方面值得注意的是JVM,因为在Java中,
      =
      操作符与Python
      操作符的含义相同。学习Java的人都在做类似的事情

      String name1 = "John";
      String name2 = "John";
      if (name1 == name2) {
          System.out.println("They have the same name!");
      }
      
      这当然是一个坏习惯,因为如果名称较长,它们将位于不同的对象中,并且比较将是错误的,就像在Python中使用
      is
      操作符一样

      为什么两者的行为不同

      这是因为只有一些INT是真正的实习生。不可能对所有值都这样做

      我将这种行为推广到所有整数和所有长整数,对吗

      int
      的情况下,没有。有些是实习的,有些不是

      另外,对于
      long
      s,你可能是对的,但我不确定。我用两个
      4L
      s测试了它,它们并不完全相同

      这是特指CPython吗


      对。语言规范中没有指定它,因此这种行为可能(也将)在其他实现中有所不同。

      你是对的,但我认为这不是这个问题的重点
      String name1 = "John";
      String name2 = "John";
      if (name1 == name2) {
          System.out.println("They have the same name!");
      }