我的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
测试它们是否是同一个对象?
==
确定值是否相等,而is
确定值是否完全相同且相等。如果两个变量指向同一个对象,则
is
将返回True
;如果变量引用的对象相等,则==
。在您的例子中,第二个测试只起作用,因为Python缓存小整数对象,这是一个实现细节。对于较大的整数,这不起作用:
字符串文本也是如此:
也请看this question。
有一个简单的经验法则可以告诉您何时使用
==
或is
。==
表示值相等。如果您想知道两个对象是否具有相同的值,请使用它。is
表示引用相等性。当您想知道两个引用是否引用同一个对象时,可以使用它。一般来说,当您将某个类型与简单类型进行比较时,通常要检查值是否相等,因此应该使用
==
。例如,您的示例的目的可能是检查x是否有一个等于2的值(==
),而不是x
是否真正地引用了与2相同的对象。需要注意的是:由于CPython引用实现的工作方式,如果您错误地使用
is
来比较整数上的引用相等性,将得到意外且不一致的结果:这几乎是我们所期望的:
a
和b
具有相同的值,但是是不同的实体。但是这个呢?这与先前的结果不一致。怎么回事?出于性能原因,Python的引用实现将-5..256范围内的整数对象缓存为单实例。下面是一个例子:
这是不使用
is
的另一个明显原因:当您错误地将行为用于值相等时,它将由实现决定。相关问题 更多 >
编程相关推荐