4 回答

TA贡献1842条经验 获得超22个赞
is将返回True如果两个变量指向同一个对象,==如果由变量所提到的对象是相等的。
>>> a = [1, 2, 3]
>>> b = a
>>> b is a
True
>>> b == a
True
>>> b = a[:] # Make a new copy of list `a` via the slice operator, and assign it to variable `b`
>>> b is a
False
>>> b == a
True
在您的情况下,第二个测试只有效,因为Python缓存小整数对象,这是一个实现细节。对于较大的整数,这不起作用:
>>> 1000 is 10**3
False
>>> 1000 == 10**3
True
对于字符串文字也是如此:
>>> "a" is "a"
True
>>> "aa" is "a" * 2
True
>>> x = "a"
>>> "aa" is x * 2
False
>>> "aa" is intern(x*2)
True
请同时查看此问题。

TA贡献1845条经验 获得超8个赞
有一个简单的经验法则告诉你何时使用==或is。
==是为了价值平等。当您想知道两个对象是否具有相同值时,请使用它。
is是供参考平等。当您想知道两个引用是否引用同一个对象时,请使用它。
通常,当您将某些内容与简单类型进行比较时,通常会检查值是否相等,因此您应该使用==。例如,您的示例的意图可能是检查x是否具有等于2(==)的值,而不是x字面上是否指向与2相同的对象。
还有一点要注意:由于CPython参考实现的工作方式,如果你错误地is用来比较整数上的引用相等性,你会得到意想不到的和不一致的结果:
>>> a = 500
>>> b = 500
>>> a == b
True
>>> a is b
False
这几乎是我们的预期:a并且b具有相同的价值,但却是不同的实体。但是这个怎么样?
>>> c = 200
>>> d = 200
>>> c == d
True
>>> c is d
True
这与之前的结果不一致。这里发生了什么?事实证明,由于性能原因,Python的引用实现将-5..256范围内的整数对象缓存为单例实例。这是一个证明这一点的例子:
>>> for i in range(250, 260): a = i; print "%i: %s" % (i, a is int(str(i)));
...
250: True
251: True
252: True
253: True
254: True
255: True
256: True
257: False
258: False
259: False
这是另一个不使用的明显原因is:当您错误地将其用于值相等时,行为将留给实现。
添加回答
举报