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 - 将长/整数值与==进行比较并且是[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将长整数列表转换为整数

Linux Shell数值比较和字符串比较及相关

如何在不使用 max() 或对其进行迭代的情况下找到堆栈中的最大整数值?

Shell脚本2

Linux Shell数值比较和字符串比较及相关

Python 基础 - 4 常用数值类型(int,float,bool)操作