本篇内容主要讲解“python中“==”和“is”有什么区别”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“python中“==”和“is”有什么区别”吧!
“==”和“is”都是 Python 中的运算符。对于初学者,他们可能会把“ a==b ”解释为“ a 等于 b ”,“a is b”也可以解释为“ a是b ”。这可能就是初学者在Python
中混淆“ == ”和“ is ”的原因。
在开始之前,我想先展示一些使用“==
”和“is
”的例子。
>>> a = 5 >>> b = 5 >>> a == b True >>> a is b True
很简单,对吧?a == b
和 a is b
都返回了结果 True
。接下来我们看另一个示例:
>>> a = 1000 >>> b = 1000 >>> a == b True >>> a is b False
WTF ?!? 从第一个示例到第二个示例的唯一变化就是 a 和 b 的值从 5 到 1000。但是返回的结果在 “==
” 和 “is
” 已经不同。我们再看另一个示例:
>>> a = [] >>> b = [] >>> a == b True >>> a is b False
下面是最后一个例子,看完是不是觉得自己的脑子要爆炸?
>>> a = 1000 >>> b = 1000 >>> a == b True >>> a is b False >>> a = b >>> a == b True >>> a is b True
“==
”的正式运算是相等,而“is
”的运算是标识。 一般使用“==
”来比较两个对象的值。 “ a == b
”应解释为“ a的值是否等于b的值
”。 在上述所有示例中,a 的值始终等于 b 的值(即使对于空列表示例也是如此)。 因此,“a == b
”始终为真。
(推荐教程:python教程)
在解释身份之前,我需要先介绍id
函数。 我们可以使用 id
函数获得对象的标识。 这个身份在整个时间内对于此对象都是唯一且恒定的。此标识在整个时间内对该对象是唯一且不变的。你可以把它看作是这个对象的地址。如果两个对象具有相同的标识,则它们的值也必须相同。
>>> id(a) 2047616
运算符“ is
”是比较两个对象的标识是否相同。“a is b
”的意思是“a的身份与b的身份相同
”。
如果你知道“ ==
”和“ is
”的实际含义,我们就可以开始研究上面的几个示例了。
首先是第一个和第二个示例中的结果不同。 显示不同结果的原因是Python
存储了一个介于-5到256之间的整数的数组列表,每个整数具有固定的标识。当我们在此范围内分配整数变量时,Python
会将此变量的标识分配为数组列表内整数的整数。 结果,对于第一个示例,由于a
和b
的标识都是从数组列表中获得的,因此它们的标识当然是相同的,因此 “a is b
” 为True
。
>>> 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
PS:如果你打开了两个控制台,该值仍在该范围内,那么你将获得相同的标识。但是,如果该值不在该范围内,则结果就会发生改变。
如果你理解了第一示例和第二示例之间的区别,就很容易理解第三示例的结果。由于 Python
不存储“空列表”对象,因此 Python
创建了一个新对象并分配了“空列表”值。无论两个列表为空还是元素相同,结果都是相同的。
>>> a = [1,10,100,1000] >>> b = [1,10,100,1000] >>> a == b True >>> a is b False >>> 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 >>> a 2000 >>> b 2000
如上所示,在 a = b
之后,a 的身份更改为 b 的身份。a = b
将 b 的身份分配给 a 。因此 a 和 b 具有相同的标识,因此 a 的值现在与 b 的值相同(即2000)。
(推荐微课:python3基础微课)
最后一个示例告诉我们一个重要消息,即我们可能会无意中更改对象的值,而不会事先通知,尤其是当对象是列表时。
>>> 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”有什么区别”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。