本文转载自公众号《核心阅读》(ID:AI_Discovery)。前几天在Reddit上浏览“学习python”版块的相关内容时,看到有Reddit用户又问了这个问题:“==”和“is”有什么区别?虽然这个问题网上已经有太多的解答和解释了,但是很多初学者还是不知道,还是会犯错误。“==”和“is”都是Python中的运算符。初学者可能会将“a==b”解释为“a等于b”,将“aisb”解释为“aisb”。也许这就是Python初学者混淆“==”和“is”的原因。在继续之前,我想给出一些“==”和“is”的用例:>>>a=5>>>b=5>>>a==bTrue>>>aisbTrueEasy?a==b和aisb都返回True。下一个例子:>>>a=1000>>>b=1000>>>a==bTrue>>>aisbFalse为什么?第二个例子和第一个唯一的区别是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(a)2047616运算符“is”用于比较两个对象的标识符是否相同,“aisb”表示“a的标识符与b的标识符相同”。图片来源:unsplash既然你知道“==”和“is”的真正含义,我们就可以开始深入讨论上面的例子了。首先是第一种情况和第二种情况的结果的区别。因为Python存储了一个-5到256之间的整数数组列表,每个整数都有一个固定的对应标识符。当您在此范围内分配一个整数变量时,Python将其标识分配为数组列中的整数。所以,对于第一种情况,由于a和b的身份都是从数组列表中得到的,所以他们的身份当然是一样的,所以aisb为真。>>>a=5>>>id(a)1450375152>>>b=5>>>id(b)1450375152但是一旦变量的值不在这个范围内,由于没有对象对应的值在Python内部,因此Python会为这个变量创建一个新的标识符,并为这个变量赋值。如前所述,每个创建的ID都是唯一的,因此即使两个变量具有相同的值,它们的ID也永远不会相等。这就是为什么aisb在第二个示例中返回False的原因。>>>a=1000>>>id(a)12728608>>>b=1000>>>id(b)13620208另外,假设你打开两个控制台,如果数值还在范围内,你也可以得到同一个身份证。但是,如果值不在区间内,结果当然不同。一旦了解了第一种情况和第二种情况的区别,就很容易理解第三种情况的结果。由于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的logo就变成了b的logo。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]希望这篇文章可以帮助你彻底解决这个问题,不要再被同样的问题困住。
