乐趣区

关于python:Python对象比较is-vs

当我还是个孩子的时候,咱们的街坊有两只双胞胎猫。他们看起来截然不同——同样的炭彩色皮毛和同样扎眼的绿色眼睛。

撇开一些性情怪癖不谈,你不能仅仅看它们就辨别它们。但当然,它们是两只不同的猫,两个不同的生物,只管它们看起来齐全一样。

这使我想到了相等和雷同之间的含意差别。这种差别对于了解 Python 的 is 和 == 比拟运算符的行为形式至关重要。

== 运算符通过查看是否相等来进行比拟:如果这些猫是 Python 对象并且咱们将它们与 == 运算符进行比拟,咱们会失去“两只猫相等”作为答案。

然而,is 运算符比拟身份(同一性):如果咱们将猫与 is 运算符进行比拟,咱们会失去“这是两只不同的猫”作为答案。

但在我纠结于这个麻绳猫的类比之前,让咱们看一下一些真正的 Python 代码。

首先,咱们将创立一个新的列表对象并将其命名为 a,而后定义另一个指向同一个列表对象的变量 (b):

In [2]: a = [1, 2, 3]

In [3]: b = a

让咱们查看这两个变量。咱们能够看到它们指向外观雷同的列表:

In [4]: a
Out[4]: [1, 2, 3]

In [5]: b
Out[5]: [1, 2, 3]

因为这两个列表对象看起来雷同,所以当咱们应用 == 运算符比拟它们是否相等时,咱们将失去预期的后果:

In [6]: a == b
Out[6]: True

然而,这并不能通知咱们 a 和 b 是否实际上指向同一个对象。

当然,咱们晓得它们是指向同一个对象,是因为咱们之前指定了它们,但假如咱们不晓得——咱们怎么会发现呢?

答案是用 is 运算符比拟这两个变量。这证实了这两个变量实际上都指向一个列表对象:

In [7]: a is b
Out[7]: True

让咱们看看当咱们创立列表对象的雷同正本时会产生什么。咱们能够通过在现有列表上调用 list() 来创立一个咱们将命名为 c 的正本:

In [8]: c = list(a)
您将再次看到咱们刚刚创立的新列表看起来与 a 和 b 指向的列表对象雷同:

In [9]: c
Out[9]: [1, 2, 3]

当初这就是乏味的中央。让咱们应用 == 操作符将咱们的列表正本 c 与初始列表 a 进行比拟。你心愿看到什么答案?

In [10]: a == c
Out[10]: True

好吧,我心愿这是你所冀望的。这个后果通知咱们的是 c 和 a 具备雷同的内容。Python 认为它们是平等的。但它们实际上指向的是同一个对象吗?让咱们用 is 运算符找出答案:

In [11]: a is c
Out[11]: False

砰!这是咱们失去不同后果的所在。Python 通知咱们 c 和 a 指向两个不同的对象,即便它们的内容可能雷同。

因而,回顾一下,让咱们尝试将 is 和 == 之间的区别合成为两个简短的定义:

如果两个变量指向同一个(雷同的)对象,则 is 表达式的计算结果为 True

如果变量援用的对象相等(具备雷同的内容),则 == 表达式的计算结果为 True

最近整顿了几百 G 的 Python 学习材料,蕴含新手入门电子书、教程、源码等等,收费分享给大家!想要的返回“Python 编程学习圈 ”,发送“J”即可收费取得

退出移动版