2

使用 Python2.7,如果我尝试比较两个数字的身份,我不会得到相同的结果intlong

整数

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

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

我有几个相关的问题:

  • 为什么两者的行为不同?
  • 我将这种行为推广到所有ints 和所有longs 是否正确?
  • 这是 CPython 特定的吗?
4

4 回答 4

5

int这不是和之间的区别long。CPython实习生小整数(从-5256

>>> a = 257
>>> b = 257
>>> a is b
False
于 2013-06-10T12:50:34.070 回答
4

为什么两者的行为不同?

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

我将这种行为推广到所有整数和所有长整数是否正确?

不,正如我所说,它只发生在小整数上。短字符串也会发生这种情况。(短表示少于 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运算符一样。

于 2013-06-10T13:08:05.963 回答
2

为什么两者的行为不同?

这是因为只有一些 int 真正被实习。它不能对真正的所有值进行。

我将这种行为推广到所有整数和所有长整数是否正确?

在 的情况下int,没有。有些被拘留,有些没有。

AFAICT,对于longs,您可能是对的,但我不确定。我用两个4Ls测试过,它们并不完全相同。

这是 CPython 特定的吗?

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

于 2013-06-10T13:08:23.573 回答
-2

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

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

然后你会得到结果

both are same
于 2013-06-10T13:01:03.340 回答