Python 对象比较:is与==

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

但这个操作并没有告诉我们ab是否真的指向同一个对象。当然,我们知道是这样的,因为之前是我们亲自为其赋值的。不过假设我们不知道,那么应该如何检查呢?
答案是用is操作符比较这两个变量。这样就能确认两个变量实际上都指向同一个列表对象:

>>> a is b
True

下面来为之前的列表对象创建一个完全相同的副本,即对已有的列表调用list(),创建一个名为c的副本:

>>> c = list(a)

同样,新的列表看上去与ab指向的列表相同:

>>> c
[1, 2, 3]

下面就到了有趣的地方。用==操作符比较列表副本c和原先的列表a,你期望看到什么结果?

>>> a == c
True

好吧,希望这就是你所期望的结果。结果显示ca含有相同的内容。因此Python认为两者是相等的。但它们是否指向同一个对象呢?我们用is操作符验证一下:

>>> a is c
False

看,这里得到不同的结果了。虽然内容相同,但Python告诉我们,ca指向的是不同的对象。

来概括一下吧,用两条定义区分is==的区别:

  • 当两个变量指向同一个对象时,is表达式的结果为True

  • 当各变量指向的对象含有相同内容时,==表达式的结果为True

当你需要在Python中选择is==时,只要回想前面两只猫的示例就可以了。你一定没问题的。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程