Python 对象比较:is与== ,当我还是个孩子的时候,邻居家有一对双胞胎猫。这两只猫看起来完全相同,都有炭黑色的毛发和锐利的绿色眼睛。除非依靠一些个性上的小癖好,否则单从外表无法区分这两只猫。尽管看起来完全一样,但它们依然是两只不同的猫,两个不同的生物。
这让我意识到了“相等”和“相同”两者之间的含义是有所区别的。这种区别对理解Python的is
和==
比较操作符至关重要。
==
操作符比较的是相等性,即如果那两只猫是Python对象,那么使用==
操作符得到的答案是“两只猫是一样的”。
然而is
操作符比较的是相同性,即如果用is
操作符比较那两只猫,则得到的答案是“两只猫不是同一只猫”。
在被这些用猫打的比方弄迷糊之前,我们来看看真实的Python代码。
首先,创建一个新的列表对象a
,接着定义另一个变量b
并指向相同的列表对象:
>>> a = [1, 2, 3]
>>> b = a
查看这两个变量,可以发现这两个列表看上去相同:
>>> a
[1, 2, 3]
>>> b
[1, 2, 3]
由于这两个列表对象看上去相同,因此当使用==
操作符比较时也会获得期望的结果:
>>> a == b
True
但这个操作并没有告诉我们a
和b
是否真的指向同一个对象。当然,我们知道是这样的,因为之前是我们亲自为其赋值的。不过假设我们不知道,那么应该如何检查呢?
答案是用is
操作符比较这两个变量。这样就能确认两个变量实际上都指向同一个列表对象:
>>> a is b
True
下面来为之前的列表对象创建一个完全相同的副本,即对已有的列表调用list()
,创建一个名为c
的副本:
>>> c = list(a)
同样,新的列表看上去与a
和b
指向的列表相同:
>>> c
[1, 2, 3]
下面就到了有趣的地方。用==
操作符比较列表副本c
和原先的列表a
,你期望看到什么结果?
>>> a == c
True
好吧,希望这就是你所期望的结果。结果显示c
和a
含有相同的内容。因此Python认为两者是相等的。但它们是否指向同一个对象呢?我们用is
操作符验证一下:
>>> a is c
False
看,这里得到不同的结果了。虽然内容相同,但Python告诉我们,c
和a
指向的是不同的对象。
来概括一下吧,用两条定义区分is
和==
的区别:
- 当两个变量指向同一个对象时,
is
表达式的结果为True
; -
当各变量指向的对象含有相同内容时,
==
表达式的结果为True
。
当你需要在Python中选择is
和==
时,只要回想前面两只猫的示例就可以了。你一定没问题的。