为了账号安全,请及时绑定邮箱和手机立即绑定

“==”和“是”之间有区别吗?

“==”和“是”之间有区别吗?

绝地无双 2019-05-25 14:39:29
“==”和“是”之间有区别吗?我的Google-fu让我失望了。在Python中,以下两个相等的测试是否等效?n = 5# Test one.if n == 5:     print 'Yay!'# Test two.if n is 5:     print 'Yay!'对于你要比较实例的对象(list比如说),这是否适用?好的,所以这样的答案我的问题:L = []L.append(1)if L == [1]:     print 'Yay!'# Holds true, but...if L is [1]:     print 'Yay!'# Doesn't.所以==测试值测试的地方is是否是同一个对象?
查看完整描述

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

请同时查看此问题


查看完整回答
反对 回复 2019-05-25
?
精慕HU

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:当您错误地将其用于值相等时,行为将留给实现。


查看完整回答
反对 回复 2019-05-25
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

==确定值是否相等,同时is确定它们是否完全相同且相等。


查看完整回答
反对 回复 2019-05-25
  • 4 回答
  • 0 关注
  • 619 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号