Python - 使用 == 和 is 比较长整型值

9 投票
2 回答
58277 浏览
提问于 2025-04-16 08:41

可能重复的问题:
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)

撰写回答