为什么CPython ints是唯一的,而不是很长?
使用Python2.7,如果我尝试比较两个数字的标识,则对于为什么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
int
和long
不会得到相同的结果
int
>>> a = 5
>>> b = 5
>>> a is b
True
long
>>> a = 885763521873651287635187653182763581276358172635812763
>>> b = 885763521873651287635187653182763581276358172635812763
>>> a is b
False
我有几个相关的问题:
- 为什么两者的行为不同
- 我将此行为推广到所有
s和所有int
s是否正确long
- 这是特指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!");
}