Python - 使用 == 和 is 比较长整型值
可能重复的问题:
Python中的“is”运算符在处理整数时表现得很奇怪
昨晚遇到了一些奇怪的事情,我在做
if max_urls is 0:
max_urls = 10
时总是返回假... 即使max_urls是0.... 它是从数据库中获取的。当我做了一个
print type(max_urls)
时返回的是
<type 'long'> 0
这看起来是对的,但它总是返回假。
如果我把它改成
if max_urls == 0:
max_urls = 10
那么当它是0时,最终会返回真。为什么==和is之间会有这样的区别呢?
2 个回答
6
is
操作符用来检查两个引用是否指向同一个对象。你在测试 long(0)
和 int(0)
是否是同一个对象,答案是否定的。如果你打印它们的对象 ID,就会很清楚这一点:
>>> max_urls = long(0)
>>> id(max_urls)
335952
>>> id(0)
8402324
而 ==
则是检查两个值是否相等,即使它们不是完全相同的对象。例如:
>>> a = 777
>>> b = 777
>>> a is b
False
>>> a == b
True
>>> id(a)
8404568
>>> id(b)
8404640
注意:我使用 777 而不是像 1 或 2 这样的小数字是很重要的。引用自 Python 手册:
当前的实现会为所有 -5 到 256 之间的整数保持一个整数对象的数组,当你在这个范围内创建一个 int 时,你实际上只是得到了对现有对象的引用。
24
==
是用来比较值的,而 is
是用来比较对象的身份(也就是内存地址)。你会发现像 max_urls is 0
这样的比较通常会得到你想要的结果,因为在 Python 中,小的数值通常会被缓存起来。但在检查是否相等时,你总是应该使用 ==
而不是 is
,因为这种行为并不总是可靠。
下面是一个简单的例子来说明这一点:
>>> a = 0
>>> (a == 0, a is 0)
(True, True)
>>> a = 1000
>>> (a == 1000, a is 1000)
(True, False)