Python中==与is的区别是什么

这篇文章主要介绍“Python中==与is的区别是什么”,在日常操作中,相信很多人在Python中==与is的区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python中==与is的区别是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

麻城ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18980820575(备注:SSL证书合作)期待与您的合作!

“==”和“is”都是Python中的运算符。初学者可能会把“a == b”理解为“a等于b”,而把“a is b” 理解为 “a is  b”。也许这就是Python初学者混淆“==”和“is”的原因。

在深入讨论之前,我想先举几个“==” 和 “is”的用例:

>>> a = 5 >>> b = 5 >>> a == bTrue>>> a is b True

简单吧?a== b 和 a is b 都能返回 True。下一个例子:

>>> a = 1000 >>> b = 1000 >>> a == bTrue>>> a is b False

这是为什么?第二个例子与第一个唯一的不同就在于a和b的值从5变成了1000,但是“==” 和 “is”输出的结果却完全不同。再看下一例:

>>> a = [] >>> b = []>>> a == bTrue>>> a is b False

如果这还不够震惊,再看最后一个例子:

>>> a = 1000 >>> b = 1000 >>> a == bTrue>>> a is b False>>> a = b>>> a == bTrue>>> a is b True

“==”的正式运算是相等,而“is”的运算是标识。用“==”是比较两个对象的值。“a ==  b”应解释为“a的值是否等于b的值”。在上述所有示例中,a的值始终等于b的值(即使对于空列的示例也是如此),因此“a == b”始终为真。

在解释标识的概念之前,我需要先介绍一下id函数。对象的标识可以通过id函数来获得。一个对象的标识始终是唯一且恒定的,你可以将其视为该对象的地址。如果两个对象的标识相同,则它们的值也一定相同。

>>> id(a) 2047616

运算符“is”用于比较两个对象的标识是否相同,“a is b”就表示“a的标识与b的标识相同”。

现在你知道了“==”和“is”的真正含义,我们就可以开始深入讨论上述示例。

首先是第一例和第二例的结果差异。因为Python存储了一个介于-5到256之间的整数数组列表,每一个整数都有固定的对应标识。当你在此范围内分配整数变量时,Python就会将此变量作为数组列里的整数为其分配标识。

因此,在第一例中,由于a和b的标识都是从数组列表中获得的,所以他们的标识当然相同,因此a is b为真。

>>> a = 5 >>> id(a) 1450375152 >>> b = 5 >>> id(b) 1450375152

但一旦变量的值不在这个区间范围内,由于Python内部没有对应该值的对象,因此Python将为此变量创建新的标识,并为这个变量赋值。

如前所述,每个创建的标识都是唯一的,因此即使两个变量的值相同,他们的标识也永远不会等同。这就是为什么第二例中的a is b返回False。

>>> a = 1000 >>> id(a) 12728608 >>> b = 1000 >>> id(b) 13620208

另外,假设你打开的是两个控制台,如果该值仍在区间内,也能得到相同标识。但是,如果该值不在区间内,结果当然就不同了。

Python中==与is的区别是什么

一旦理解了第一例和第二例的区别,就很容易理解第三例的结果了。由于Python不存储“空列表”对象,所以Python创建了一个新对象并赋值“空列表”。无论这两个列表是空还是元素相同,结果都是一样的。

>>> a = [1,10,100,1000] >>> b = [1,10,100,1000] >>> a == bTrue>>> a is bFalse>>> 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的值也会受到影响。为了避免这种情况,如果要把一个对象的值复制到另一对象,又不引用同一标识,一个方法是在copy模块中使用deepcopy。对于列表,你还可以通过b=  a[:]来实现。

>>> import copy >>> 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]

到此,关于“Python中==与is的区别是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!


本文标题:Python中==与is的区别是什么
网页链接:http://hbruida.cn/article/pjgiji.html