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

2024-04-19 03:08:37 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 对象实例testifisgoogleonelist
3条回答

==确定值是否相等,而is确定值是否完全相同且相等。

如果两个变量指向同一个对象,则is将返回True;如果变量引用的对象相等,则==

>>> a = [1, 2, 3]
>>> b = a
>>> b is a 
True
>>> b == a
True

# Make a new copy of list `a` via the slice operator, 
# and assign it to variable `b`
>>> b = a[:] 
>>> 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

也请看this question

有一个简单的经验法则可以告诉您何时使用==is

  • ==表示值相等。如果您想知道两个对象是否具有相同的值,请使用它。
  • is表示引用相等性。当您想知道两个引用是否引用同一个对象时,可以使用它。

一般来说,当您将某个类型与简单类型进行比较时,通常要检查值是否相等,因此应该使用==。例如,您的示例的目的可能是检查x是否有一个等于2的值(==),而不是x是否真正地引用了与2相同的对象。


需要注意的是:由于CPython引用实现的工作方式,如果您错误地使用is来比较整数上的引用相等性,将得到意外且不一致的结果:

>>> a = 500
>>> b = 500
>>> a == b
True
>>> a is b
False

这几乎是我们所期望的:ab具有相同的值,但是是不同的实体。但是这个呢?

>>> 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的另一个明显原因:当您错误地将行为用于值相等时,它将由实现决定。

相关问题 更多 >