使用Python2.7,如果我尝试比较两个数字的身份,我对int
和long
的结果不一样。
int
>>> a = 5
>>> b = 5
>>> a is b
True
长
>>> a = 885763521873651287635187653182763581276358172635812763
>>> b = 885763521873651287635187653182763581276358172635812763
>>> a is b
False
我有一些相关的问题:
int
和所有long
s?答案 0 :(得分:5)
这不是int
和long
之间的差异。 CPython实习小内容(从-5
到256
)
>>> a = 257
>>> b = 257
>>> a is b
False
答案 1 :(得分:4)
在CPython中创建新值时,实质上是创建一个包含该值的整个新对象。对于小整数值(从-5到256),CPython决定重用您之前创建的旧对象。这被称为 interning ,它出于性能原因而发生 - 保持旧对象而不是创建新对象被认为更便宜。
没有。正如我所说,它只发生在小额中。它也适用于短串。 (短的意思是少于7个字符。)不要依赖于此。只是出于性能原因,你的程序不应该依赖于值的实现。
完全没有。虽然细节可能有所不同,但许多其他平台都会实习。在这方面值得注意的是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