为什么Python intt是唯一的,而不是长期的?

时间:2013-06-10 12:49:02

标签: python identity python-2.x

使用Python2.7,如果我尝试比较两个数字的身份,我对intlong的结果不一样。

int

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

>>> a = 885763521873651287635187653182763581276358172635812763
>>> b = 885763521873651287635187653182763581276358172635812763
>>> a is b
False

我有一些相关的问题:

  • 为什么两者之间的行为不同?
  • 我是否正确将此行为推广到所有int和所有long s?
  • 这个CPython具体吗?

4 个答案:

答案 0 :(得分:5)

这不是intlong之间的差异。 CPython实习小内容(从-5256

>>> a = 257
>>> b = 257
>>> a is b
False

答案 1 :(得分:4)

为什么两者之间的行为不同?

在CPython中创建新值时,实质上是创建一个包含该值的整个新对象。对于小整数值(从-5到256),CPython决定重用您之前创建的旧对象。这被称为 interning ,它出于性能原因而发生 - 保持旧对象而不是创建新对象被认为更便宜。

我是否正确将此行为推广到所有整数和所有多头?

没有。正如我所说,它只发生在小额中。它也适用于短串。 (短的意思是少于7个字符。)不要依赖于此。只是出于性能原因,你的程序不应该依赖于值的实现。

这个CPython具体吗?

完全没有。虽然细节可能有所不同,但许多其他平台都会实习。在这方面值得注意的是JVM,因为在Java中,==运算符与Python is运算符的含义相同。学习Java的人正在做像

这样的事情
String name1 = "John";
String name2 = "John";
if (name1 == name2) {
    System.out.println("They have the same name!");
}

这当然是一个坏习惯,因为如果名称更长,它们将在不同的对象中,并且比较将是错误的,就像在Python中使用is运算符一样。

答案 2 :(得分:2)

  

为什么两者之间的行为不同?

这是因为只有一些int真正实习。它无法在所有值上完成。

  

我是否正确将此行为推广到所有整数和所有多头?

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

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

  

这个CPython具体吗?

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

答案 3 :(得分:-2)

尝试这种方式,然后您就可以比较数据

a = 885763521873651287635187653182763581276358172635812763
b = 885763521873651287635187653182763581276358172635812763
if a == b:
 print 'both are same'

然后你会得到结果

both are same