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

2024-04-29 17:15:38 发布

您现在位置:Python中文网/ 问答频道 /正文

Possible Duplicate:
Python “is” operator behaves unexpectedly with integers

昨晚在哪里遇到了奇怪的事

if max_urls is 0:
    max_urls = 10

总是会返回错误。。。即使最大URL是0。。。。它是从数据库中分配的。当我做一个

print type(max_urls)

会回来的

<type 'long'> 0

这似乎是对的,但它总是会返回错误。

如果我把它改成

if max_urls == 0:
    max_urls = 10

最后,当它是0时,它将返回true。为什么==和is之间有区别?


Tags: integers数据库urlifistype错误with
2条回答

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

The current implementation keeps an array of integer objects for all integers between -5 and 256, when you create an int in that range you actually just get back a reference to the existing object.

==是值比较,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)

相关问题 更多 >