当前位置: 首页 > 后端技术 > Python

Python对象比较:“is”vs“==”

时间:2023-03-26 18:46:05 Python

我小时候,我们的邻居有两只双胞胎猫。他们看起来一模一样——同样的炭黑色皮毛和同样锐利的绿色眼睛。除了一些性格怪癖,你不能仅仅通过观察来区分他们。但当然,它们是两只不同的猫,两种不同的生物,尽管它们看起来完全一样。这使我想到相等和相同之间的含义差异。这种差异对于理解Python的is和==比较运算符的行为方式至关重要。==运算符通过检查相等性进行比较:如果猫是Python对象,我们将它们与==运算符进行比较,我们得到“两只猫是相等的”作为答案。但是,is运算符比较的是身份(identity):如果我们用is运算符比较猫,我们会得到“这是两只不同的猫”作为答案。但在我对这只猫的麻线类比陷入困境之前,让我们看看一些真实的Python代码。首先,我们将创建一个新的列表对象并将其命名为a,然后定义另一个变量(b)指向同一个列表对象:In[2]:a=[1,2,3]In[3]:b=a让我们检查两个变量。我们可以看到它们指向的列表看起来是一样的:In[4]:aOut[4]:[1,2,3]In[5]:bOut[5]:[1,2,3]因为这两个列表对象看起来相同,所以当我们使用==运算符比较它们是否相等时,我们得到预期的结果:In[6]:a==bOut[6]:True然而,这并没有告诉我们a和b是否实际指向同一个对象。当然,我们知道它们指向同一个对象,因为我们之前指定了它们,但假设我们不这样做——我们怎么知道呢?答案是用is运算符比较两个变量。这证实了两个变量实际上都指向一个列表对象:In[7]:aisbOut[7]:True让我们看看当我们创建列表对象的相同副本时会发生什么。我们可以通过在现有列表上调用list()来创建一个我们将命名为c的副本:在[8]中:c=list(a)您将再次看到我们刚刚创建的新列表看起来与a和b指向的相同相同的列表对象:In[9]:cOut[9]:[1,2,3]现在这就是它变得有趣的地方。让我们使用==运算符将列表c的副本与初始列表a进行比较。你想看什么答案?In[10]:a==cOut[10]:True嗯,我希望这是你所期望的。这个结果告诉我们的是c和a的内容是一样的。Python认为它们相等。但它们实际上指向同一个对象吗?让我们用is运算符找出答案:In[11]:aiscOut[11]:FalseBang!这是我们得到不同结果的地方。Python告诉我们c和a指向两个不同的对象,即使它们的内容可能相同。因此,回顾一下,让我们尝试将is和==之间的区别分解为两个简短的定义:如果两个变量引用相同(相同)的对象,如果变量引用的对象相等(具有相同的内容),则==表达式的计算结果为True。近期整理了数百G的Python学习资料,包括入门电子书、教程、源码等,免费分享给大家!想上“Python编程学习圈”,发“J”免费领取