Python - 将长/整数值与==进行比较并且是[重复]
Posted
技术标签:
【中文标题】Python - 将长/整数值与==进行比较并且是[重复]【英文标题】:Python - comparing long/integer values with == and is [duplicate] 【发布时间】:2011-05-27 07:09:00 【问题描述】:可能重复: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
这似乎是正确的,但它总是会返回 false。
如果我把它改成
if max_urls == 0:
max_urls = 10
那么最终它会在它为 0 时返回 true。为什么 == 和 is 之间的区别?
【问题讨论】:
不要使用is
来检查数字是否相等。顺便说一句,***.com/questions/306313/… 的重复。
另一个可能的重复:***.com/questions/3218308/…
让我们缩短这个并跳到结论:搜索发现了一百个重复,所有这些都是由不知道==
和is
之间(非常基本的)区别的人提出的。跨度>
【参考方案1】:
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 时,实际上您只是获取对现有对象的引用。
【讨论】:
【参考方案2】:==
是值比较,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)
【讨论】:
我会强调它没有按预期“工作”,尽管它确实给出了预期的结果。如果您使用错误的方法来获得正确的结果,那么您不仅会有一个潜在的错误会再次困扰您(例如,在维护后期),而且您甚至无法测试它(例如,当前的 CPython 没有正如你所说,这段代码的区别)。以上是关于Python - 将长/整数值与==进行比较并且是[重复]的主要内容,如果未能解决你的问题,请参考以下文章