关于python中的is和==的区别
Python 中的比较:is 与 ==
在 Python 中会用到对象之间比较,可以用 ==,也可以用 is 。但是它们的区别是什么呢?
is 比较的是两个实例对象是不是完全相同,它们是不是同一个对象,占用的内存地址是否相同。莱布尼茨说过:“世界上没有两片完全相同的叶子”,这个is正是这样的比较,比较是不是同一片叶子(即比较的id是否相同,这id类似于人的身份证标识)。
== 比较的是两个对象的内容是否相等,即内存地址可以不一样,内容一样就可以了。这里比较的并非是同一片叶子,可能叶子的种类或者脉络相同就可以了。默认会调用对象的 __eq__()方法。
可以通过如下例子来区分比较下:
>>> a = ["I", "love", "Python"]
>>> b = a
# a的引用复制给b,在内存中其实是指向了用一个对象
>>> b is a
True
>>> id(a)
46381384
>>> id(b)
46381384
# 当然,内容也肯定是相等的
>>> b == a
True
可以发现b和a的内存地址是相同的,它们指向同一块内存,因而 is 和 == 的结果都为True。这是因为直接赋值都是赋值的引用,是引用,是引用,重要的事情说三遍。但如果不是通过引用赋值,而是通过切片赋值呢?
# b通过切片操作重新分配了对象,但是值和a相同
>>> b = a[:]
>>> b is a
False
>>> id(a)
48740680
>>> id(b)
48740680
>>> b == a # 但他们的值还是相等的
True
新建对象之后,b 和 a 指向了不同的内存,所以 b is a 的结果为False,而 b==a的结果为True。在这里,小编提一个问题,b[0] is a[0] 的结果呢?
答案是True。因为切片拷贝是浅拷贝,列表中的元素并未重新创建。不理解的同学请翻看之前的文章 Python中的浅拷贝与深拷贝。
通常,我们关注的是值,而不是内存地址,因此 Python 代码中 == 出现的频率比 is 高。但是什么时候用 is 呢?
is 与 == 相比有一个比较大的优势,就是计算速度快,因为它不能重载,不用进行特殊的函数调用,少了函数调用的开销而直接比较两个整数 id。而 a == b 则是等同于a.__eq__(b)。继承自 object 的 __eq__ 方法比较两个对象的id,结果与 is 一样。但是多数Python的对象会覆盖object的 __eq__方法,而定义内容的相关比较,所以比较的是对象属性的值。
在变量和单例值之间比较时,应该使用 is。目前,最常使用 is 的地方是判断对象是不是 None。下面是推荐的写法:
a is None
判断不是None的推荐写法是:
a is not None
Python会对比较小的整数对象进行缓存,下次用的时候直接从缓存中获取,所以is 和 == 的结果可能相同:
>>> a = 1
>>> b = 1
>>> a is b
True
>>> a == b
True
而看一下另外一段代码:
>>> a = 257
>>> b = 257
>>> a is b
False
这是什么原因呢?
注意,Python仅仅对比较小的整数对象进行缓存(范围为范围[-5, 256])缓存起来,而并非是所有整数对象。需要注意的是,这仅仅是在命令行中执行,而在Pycharm或者保存为文件执行,结果是不一样的,这是因为解释器做了一部分优化。
总结
1、is 比较两个对象的 id 值是否相等,是否指向同一个内存地址;
2、== 比较的是两个对象的内容是否相等,值是否相等;
3、小整数对象[-5,256]在全局解释器范围内被放入缓存供重复使用;
4、is 运算符比 == 效率高,在变量和None进行比较时,应该使用 is。
关于python中的is和==的区别的更多相关文章
- Python中type与Object的区别
Python中type与Object的区别 在查看了Python的API后,总算明白了.现在总结如下: 先来看object的说明: Python中关于object的说明很少,甚至只有一句话: clas ...
- Python中生成器和迭代器的区别(代码在Python3.5下测试):
https://blog.csdn.net/u014745194/article/details/70176117 Python中生成器和迭代器的区别(代码在Python3.5下测试):Num01–& ...
- Python中的is和==的区别,==判断值是否相等,is判断地址是否一致
Python中的is和==的区别 Python中的对象包含三要素:id.type.value. 其中id用来唯一标示一个对象,type标识对象的类型,value是对象的值. is判断的是a对象是否就是 ...
- 基于python中staticmethod和classmethod的区别(详解)
例子 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 class A(object): def foo(self,x): print "executing foo ...
- Python中send()和sendall()的区别
Python中send()和sendall()的区别 估计每个学习Python网络编程的人,都会遇到过这样的问题: send()和sendall()到底有什么区别? send()和sendall()原 ...
- Python中的is和==的区别
Python中的is和==的区别 1. is 是比较内存地址id() a = "YongJie" b = "YongJie" print(id(a)) #233 ...
- python中_new_()与_init_()的区别
__new__方法的使用 只有继承于object的新式类才能有__new__方法,__new__方法在创建类实例对象时由Python解释器自动调用,一般不用自己定义,Python默认调用该类的直接父类 ...
- python中break和continue的区别
python中break和continue的区别 break和continue 1.break 意思为结束循环 例: i = 0 while i<10: i+=1 if ...
- 从python中copy与deepcopy的区别看python引用
讨论copy与deepcopy的区别这个问题要先搞清楚python中的引用.python的内存管理. python中的一切事物皆为对象,并且规定参数的传递都是对象的引用.可能这样说听起来比较难懂,对比 ...
- python中input()和raw_input()的区别
两者均是python的内置函数,通过读取控制台的输入与用户实现交互.raw_input:将所有输入作为字符串看待,不管用户输入什么类型的都会转变成字符串. raw的 ...
随机推荐
- asp.net 基础内容
1. ViewData ViewBag TempData 区别? 1.ViewData和TempData是字典类型,赋值方式用字典方式,ViewData["myName"] 2. ...
- 05python上
location 位置 untitled 未命名的 fullstack 全栈 interpreter 解释器 字符格式化输出 占位符 %s s = string %d d = digit 整数 %f ...
- spring 的 切片Aspect 最常用记录方法执行时间
/** * */ package com.icil.esolution.aspect; import java.util.Date; import org.aspectj.lang.Proceedin ...
- 关于visual studio code在win10系统上安装后会报扩展宿主意外终止的解决方法
我的电脑的地址 C:\Users\Administrator.SC-201810160958\AppData\Local\Programs\Microsoft VS Code\resources\ap ...
- 03.设计模式_抽象工厂模式(Abstract Fcatory)
抽象工厂模式:创建一些列相关或者互相依赖的对象的接口,而无需指定他们具体的类, 1.创建工厂Factory: package patterns.design.factory; import java. ...
- Deque 双端队列 Stack 堆栈
1. peek 获取栈顶元素 pop 删除栈顶元素
- 抛出异常 exception
throw raise raise Exception.CreateFmt(sFileWithNoExt, [FileName]);
- 机器学习进阶-案例实战-图像全景拼接-图像全景拼接(RANSCA) 1.sift.detectAndComputer(获得sift图像关键点) 2.cv2.findHomography(计算单应性矩阵H) 3.cv2.warpPerspective(获得单应性变化后的图像) 4.cv2.line(对关键点位置进行连线画图)
1. sift.detectAndComputer(gray, None) # 计算出图像的关键点和sift特征向量 参数说明:gray表示输入的图片 2.cv2.findHomography(kp ...
- jquery实现增删改(伪)-老男孩作业day13
使用jquery进行,文件的编写,实现自增id,删除,添加,编辑模式. jquery放在本地,src="jquery_js.js" 可以改成其他,或者在线的路径 readme &l ...
- Windows下MongoDB安装配置
一.安装 官网下载,一般选择community server版本下载,如果是企业可以选择enterprise版本,个人使用的话community就可以了,附上链接:https://www.mongod ...