猿问

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

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

我的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是否是同一个对象?


绝地无双
浏览 620回答 4
4回答

茅侃侃

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

精慕HU

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

蛊毒传说

==确定值是否相等,同时is确定它们是否完全相同且相等。
随时随地看视频慕课网APP

相关分类

Python
我要回答