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

时间:2010-12-17 18:31:41

标签: python variables conditional-operator

  

可能重复:
  Python “is” operator behaves unexpectedly with integers

昨晚做了一些奇怪的事情

if max_urls is 0:
    max_urls = 10

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

print type(max_urls)

将返回

<type 'long'> 0

看似正确,但它总是会返回错误。

如果我将其更改为

if max_urls == 0:
    max_urls = 10

然后最终它会在0时返回true。为什么==和之间的区别是?

2 个答案:

答案 0 :(得分:22)

==是值比较,is是对象标识(内存位置)比较。您经常会看到像max_urls is 0这样的比较会给出预期的结果,因为在Python中通常通常缓存小值,但您总是希望使用==而不是{{1检查相等性时,因为无法依赖此行为。

以下是一个简短的例子:

is

答案 1 :(得分:5)

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 manual

  

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