可能重复:
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。为什么==和之间的区别是?
答案 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时,实际上只返回对现有对象的引用。