博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
学习Python,is和==的本质区别你知道吗?
阅读量:6581 次
发布时间:2019-06-24

本文共 1508 字,大约阅读时间需要 5 分钟。

在Python中,is和==都是用来对两个对象进行比较判断的,但两者却有本质的区别。

一:is操作符

is操作符是Python语言的一个内置操作符,它的作用是比较两个变量是否指向同一块内存区域,也就是判断id(对象)是否相等。
当两个变量是共享引用关系的话,它们指向的肯定是同一块内存区域,用is判断得到的结果肯定为True。

>>> a = 10>>> b = a>>> a is bTrue

如果是下面的这种情况呢?

>>> a,b = 10,10>>> a is bTrue>>> id(a), id(b)(1794638576, 1794638576)>>> a,b = "abc","abc">>> a is bTrue>>> id(a), id(b)(2281621304632, 2281621304632)>>> a = (1,2,3)>>> b = (1,2,3)>>> id(a), id(b)(2281620654120, 2281620654264)>>> a is bFalse>>> a[0] is b[0]True>>> id(a[0]), id(b[0])(1794638288, 1794638288)

从以上例子可以看到,当对象是数值类型或者字符串时,当两个对象的值相等时,它们用is判断的结果就为True,这是因为它们的id是相等的,而元组类型却不是。在Python中,对于小整数和字符串类型,在创建一个数据对象时,会优先使用缓存中的数据,如果缓存中存在,就会使用同一个数据,对于大整数、浮点数、元组、列表、字典、集合这些数据类型,会重新创建一块内存用于存储数据对象,但它们的元素如果是小整数或字符串时,也会优先使用缓存数据,这也就能解释了上面的为什么a[0]和b[0]的id是一样的。

在Python3.5.2下测试,我们发现,-5-256这些小数字Python会使用缓存进行存储。
学习Python,is和==的本质区别你知道吗?

二、==操作符

==操作符用来判断两个对象的数据是否相等,而不用关注它们的id是否一致,例如:

>>> a = 10>>> b = 10.0>>> a == bTrue>>> id(a), id(b)(1794638576, 2281597561472)

当两个类的实例进行比较时,如果实例的数据一致时也不一定相等,如下:

class TestEqual():    def __init__(self, u, v):         self.u = u        self.v = va = TestEqual(3, 4)b = TestEqual(3, 4)print(a == b)  # 输出结果为False

为了让类的实例可以进行==比较,需要重新实现eq函数。

class TestEqual():    def __init__(self, u, v):         self.u = u        self.v = v    def __eq__(self, other):        if self.u== other.u:            return True        else:            return Falsea = TestEqual(3, 4)b = TestEqual(3, 5)print(a == b)  # 输出结果为True

从上面这个示例可以看出,在eq函数内部定义的逻辑是只要u相等了,两个类的实例就可以判定为相等。

转载于:https://blog.51cto.com/14149138/2388508

你可能感兴趣的文章
spring-boot实战【01】:Hello World项目搭建
查看>>
poj 1274The Perfect Stall
查看>>
ibm BIP2276E: The flow includes a message flow of node type 'ComIbmFileReadNode'
查看>>
HDU 4720 Naive and Silly Muggles (外切圆心)
查看>>
垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
查看>>
delphi webbrowser 经常用法演示样例
查看>>
iptables相关操作以及简单理解端口和服务之间关系
查看>>
Ubuntu上运行Blender,在控制台上查看运行结果
查看>>
怎么检查网站的死链接呢?
查看>>
scrapy爬虫框架实例一,爬取自己博客
查看>>
JAVA简单选择排序算法原理及实现
查看>>
Spring MVC实现Junit Case
查看>>
HttpClient通过Post方式发送Json数据
查看>>
React是UI的未来吗?
查看>>
中国人社部:2018年15个省(区、市)调整最低工资标准
查看>>
JS中的继承
查看>>
手把手教你通过Thrift 访问ApsaraDB for HBase
查看>>
Java多线程进阶(十二)—— J.U.C之atomic框架:Unsafe类
查看>>
MacOS安装MySQL 报错
查看>>
Java知识点总结(反射-反射操作泛型)
查看>>