1

可能重复:
Python“is”运算符对整数的行为异常

我正在学习 Python,并且很好奇为什么:

x = 500
x is 500

返回 False,但是:

y = 100
y is 100

返回真?

4

3 回答 3

8

Python 重用小整数。也就是说,所有1s(例如)都是同一个1对象。如果我没记错的话,范围是 -5 到 255,尽管这是一个不应依赖的 CPython 实现细节。例如,我很确定 Jython 和 IronPython 以不同的方式处理这个问题。

这很好的原因是ints 是不可变的。也就是说,您不能将 a 更改为4就地5。ifa的值为 4,a = 5实际上是指向a不同的对象,而不是更改a包含的值。Python 不共享任何可变类型(例如列表),其中意外地对同一对象具有多个引用可能会导致问题。

您应该==用于比较大多数事物。is用于检查两个引用是否指向同一个对象;它大致相当于id(x) == id(y)

于 2012-09-24T00:41:35.843 回答
4

is身份测试 -x is y询问它们是否是同一个对象,而不是它们是否只是“等效”。所以你也有,例如:

>>> x = []
>>> y = []
>>> z = x
>>> x is y
False
>>> x is z
True

对于等价性,您要测试相等性:

>>> x = 500
>>> x == 500
True

Python(或者,至少,cpython - 主要实现)做了一些优化,以便某些不可变对象在解释器的整个生命周期中只存在一次。因此,5整个程序中的每一个都是相同的整数对象。例如,字符串文字也会发生同样的事情。

于 2012-09-24T00:43:53.533 回答
3

"is" 比较对象 ID,"==" 将比较对象值。因此,如果您需要比较值,请使用“==”,如果您想比较对象,请使用“is”。

在 Python 中,一切都是对象,比较对象 ID,它更快,但有时不可预测。您需要非常确定自己在做什么才能使用“is”进行简单比较。

关于上面的情况,我在这里找到:http ://docs.python.org/c-api/int.html有以下注释:

当前的实现为 -5 到 256 之间的所有整数保留一个整数对象数组,当您在该范围内创建一个 int 时,您实际上只是取回了对现有对象的引用。所以应该可以改变 1 的值。我怀疑 Python 在这种情况下的行为是未定义的。:-)

因此,您可以进行以下测试并查看此行为:

>>> a = 256
>>> id(a)
19707932
>>> id(256)
19707932
>>> a = 257
>>> id(a)
26286076
>>> id(257)
26286064

因此,对于 256 以上的整数,“is”将不起作用。小心使用“is”进行比较。

于 2012-09-24T01:24:43.550 回答