Python - 将长整数值与==进行比较

Wiz*_*ard 7 python variables conditional-operator

可能重复:
Python"is"运算符使用整数意外运行

昨晚做了什么奇怪的事情

if max_urls is 0:
    max_urls = 10
Run Code Online (Sandbox Code Playgroud)

总是会返回false ...即使max_urls为0 ....它也是从数据库中分配的.当我做了一个

print type(max_urls)
Run Code Online (Sandbox Code Playgroud)

会回来的

<type 'long'> 0
Run Code Online (Sandbox Code Playgroud)

这似乎是正确的,但它总是会返回虚假.

如果我把它改成了

if max_urls == 0:
    max_urls = 10
Run Code Online (Sandbox Code Playgroud)

那么当它为0时它最终会返回true.为什么==和之间的区别是?

And*_*ark 23

==是一个值比较,is是一个对象标识(memory location)的比较.您经常会看到比较之类max_urls is 0的结果将给出预期的结果,因为小值通常在Python中缓存,但您总是希望使用==而不是is在检查相等性时,因为不能依赖此行为.

这是一个简短的例子说明了这一点:

>>> a = 0
>>> (a == 0, a is 0)
(True, True)
>>> a = 1000
>>> (a == 1000, a is 1000)
(True, False)
Run Code Online (Sandbox Code Playgroud)


Joh*_*ica 6

is运营商将检查两个引用指向同一个对象.您正在测试是否long(0)与对象相同int(0),答案是否定的.如果您打印它们的对象ID,这将是非常清楚的:

>>> max_urls = long(0)
>>> id(max_urls)
335952
>>> id(0)
8402324
Run Code Online (Sandbox Code Playgroud)

==另一方面,检查两个值是否相等,即使它们不是完全相同的对象.例如:

>>> a = 777
>>> b = 777
>>> a is b
False
>>> a == b
True
>>> id(a)
8404568
>>> id(b)
8404640
Run Code Online (Sandbox Code Playgroud)

注意:重要的是我使用777而不是像1或2这样的较小数字.引用Python手册:

当前实现为-5到256之间的所有整数保留一个整数对象数组,当您在该范围内创建一个int时,实际上只返回对现有对象的引用.