当前位置: 首页 > 科技观察

-==-和-is-和有什么不一样?一个问题可以揭示你的Python水平

时间:2023-03-11 23:39:36 科技观察

网上可能经常会看到关于这个问题的解答和分析,但是还是有很多刚开始学习Python的人,对这个问题不了解,也不知道为什么问这个问题当你问一个问题时,你会暴露自己是一个“新手”:“==”和“is”有什么区别?“==”和“is”都是Python中的运算符。对于初学者,他们可能会将“a==b”解释为“a等于b”,而“aisb”也可以解释为“aisb”。这大概就是为什么初学者会混淆Python中的“==”和“is”的原因。在我们开始之前,我想展示一些使用“==”和“is”的例子。>>>a=5>>>b=5>>>a==bTrue>>>aisbTrue很简单吧?a==b和aisb都返回True。接下来我们再看一个例子:>>>a=1000>>>b=1000>>>a==bTrue>>>aisbFalseWTF?!?从第一个示例到第二个示例,唯一的变化是a和b的值从5到1000。但是返回的结果在“==”和“is”中已经不同了。再看一个例子:>>>a=[]>>>b=[]>>>a==bTrue>>>aisbFalse下面是最后一个例子,看完是不是觉得脑洞大开爆炸?>>>a=1000>>>b=1000>>>a==bTrue>>>aisbFalse>>>a=b>>>a==bTrue>>>aisbTrue"==的形式运算”是相等,而“是”的运算是恒等。一般用“=”比较两个对象的值。“a==b”应该解释为“a的值是否等于b的值”。在以上所有示例中,a的值始终等于b的值(即使对于空列表示例也是如此)。因此,“a==b”始终为真。在讲解身份之前,需要先介绍一下id函数。我们可以使用id函数获取对象的标识。这个身份对于这个对象来说是唯一的,并且在整个时间都是不变的。该ID对于该对象在整个时间段内都是唯一且不变的。您可以将其视为此对象的地址。如果两个对象具有相同的标识,那么它们的值也必须相同。>>>id(a)2047616运算符“is”是比较两个对象的身份是否相同。“aisb”的意思是“a的身份与b的身份相同”。如果你知道“==”和“is”的实际含义,我们就可以开始研究上面的几个例子了。首先是第一个例子和第二个例子的结果不同。显示不同结果的原因是Python存储了一个介于-5和256之间的整数数组列表,每个整数都有一个固定的标识。当我们在此范围内分配一个整数变量时,Python将此变量的标识分配为数组列表中整数的整数。结果,对于第一个例子,由于a和b的身份都是从数组list中得到的,所以他们的身份当然是一样的,所以“aisb”为True。>>>a=5>>>id(a)1450375152>>>b=5>>>id(b)1450375152但是一旦变量的值超过这个范围,由于Python内部没有这个值的对象,Python将为这个变量创建一个新的ID并分配这个值。如前所述,身份对于每个创建物都是唯一的,因此即使两个变量具有相同的值,它们的身份也永远不会相等。这就是为什么在第二个示例中“aisb”的计算结果为False。>>>a=1000>>>id(a)12728608>>>b=1000>>>id(b)13620208PS:如果你有两个控制台打开并且值仍在范围内,那么你将获得相同的ID.但是,如果该值超出该范围,则结果会发生变化。如果您理解了第一个示例和第二个示例之间的区别,那么就很容易理解第三个示例的结果。由于Python不存储“空列表”对象,Python创建一个新对象并分配“空列表”值。无论两个列表是否为空或具有相同的元素,结果都是相同的。>>>a=[1,10,100,1000]>>>b=[1,10,100,1000]>>>a==bTrue>>>aisbFalse>>>id(a)12578024>>>id(b)12578056接下来,让我们继续最后一个示例。第二个和最后一个例子唯一的区别就是多了一行代码a=b,也正是这行代码改变了变量a的命运。下面的结果会告诉你真正的原因:>>>a=1000>>>b=2000>>>id(a)2047616>>>id(b)5034992>>>a=b>>>id(a)5034992>>>id(b)5034992>>>a2000>>>b2000如上图,a=b后,a的身份变为b的身份。a=b将b的身份分配给a。所以a和b具有相同的标识,所以a的值现在与b的相同(即2000)。最后一个例子告诉我们一个重要信息,即我们可能会在不事先通知的情况下无意中更改对象的值,尤其是当对象是列表时。>>>a=[1,2,3]>>>id(a)5237992>>>b=a>>>id(b)5237992>>>a.append(4)>>>a[1,2,3,4]>>>b[1,2,3,4]在上面的例子中,由于a和b具有相同的身份,所以它们的值必须相同。所以,给a添加新元素后,b的值也会受到影响。为避免这种情况,如果您想将值从一个对象复制到另一个对象而不引用相同的标识,所有方法之一是在复制模块中使用deepcopy。对于列表,我们也可以通过b=a[:]来实现。>>>importcopy>>>a=[1,2,3]>>>b=copy.deepcopy(a)>>>id(a)39785256>>>id(b)5237992使用[:]复制元素到新变量。>>>a=[1,2,3]>>>id(a)39785256>>>b=a[:]>>>id(b)23850216>>>a.append(4)>>>a[1,2,3,4]>>>b[1,2,3]看完上面的内容,你是不是已经完全理解了两者的区别了呢?面试遇到这种问题,千万别答错!