在python中,== 与 is 之间既有区别,又有联系,本文将通过实际代码的演示,力争能够帮助读到这篇文章的朋友以最短的时间理清二者的关系,并深刻理解它们在内存中的实现机制。
扯淡的话不多说,下面马上呈上我的第一张图:

   通过上面代码的比较,我想很容易看得出," is" 是用来比较 a 和 b 是不是指向同一个内存单元,而"=="是用来比较 a 和 b指向的内存单元中的值是不是相等。下面敲黑板,如果你自己的实验结果和我的不一致,请不要怀疑我,也不要怀疑自己的编译器,我想你应该遇到了下面的这种情况:

上面这张图和第一张图没有什么区别,只是a 和 b的值由之前的500变成了3,但是结果却和第一张大不相同,我们发现is和==在此时都为true并且a和b的地址完全相同。尼玛,活见鬼了,我们之前的理解是a对应的500和b对应的500应该不在一个内存单元呀!其实这是python解释器搞得鬼,具体是因为python的垃圾回收机制,这个垃圾回收机制会在之后的文章中详细介绍,至于出现上面这种现象是因为一个叫小整数对象池的东西,python为了优化速度,会把【-5,256】之间的数据提前存放在小整数对象池中,程序中只要用的【-5,256】之间的数据不会再重新创建一份,都是指向对象池中的同一份数据,除了这个区间之外的数据,每次使用时系统都会重新申请一块内存,用来存储数据,这样之前的现象也就不奇怪了。 到这里,“ is ”和 “==”之间的恩怨情仇似乎介绍的差不多了,我们接下来再来单独看看“==”。你是否想过python解释器在底层是如何处理“==”的,或者说如何判断两个对象是否相等的呢? 对于数值类型的数据,只要两个数据大小相等,那么就是相等,但是对于非数值型的数据,比如字符串,类创建的对象又是比较什么呢?答案是python默认去比较两个对象的地址,有图有真相:

  我们发现上图中,p1和p2两个对象的内容完全相同,但是python编译器却认为其不相等,这个时候就需要我们自己去定义规则去规定在什么条件下两个对象是相等的,具体操作需要去重写python中的__eq__方法,通常把这个过程叫做运算符重载。下面这张图就是完成运算符重载之后的操作,我们发现这时候两个对象的值是相等的。

对于“==”和 “is”的介绍到此就结束了,希望能帮到之前对此有过困惑的小伙伴,我先撤了哈。

浅谈python中的“ ==” 与“ is”的更多相关文章

  1. 浅谈python中得import xxx,from xxx import xxx, from xxx import *

    在python中import跟from import都是用来导入的,但是导入的机制不同 1.import xxx:导入模块,或者文件夹,对于调用模块或者文件夹中子模块的变量或者函数,需要使用" ...

  2. 浅谈python中文件和文件夹的相关操作

    文件操作 文件的打开与关闭 打开文件 使用open(文件名,访问方式)函数,可以打开一个已存在的文件,或者创建一个新的文件. 示例如下: f = open('test.txt') # 访问方式可以省略 ...

  3. 浅谈python中字典append 到list 后值的改变问题

    看一个例子 ? 1 2 3 4 d={'test':1} d_test=d d_test['test']=2 print d 如果你在命令行实践的话,会发现你改动的是d_test ,但是d 也跟着改变 ...

  4. 浅谈python中的闭包函数

    闭包函数初探 通常我们定义函数都是这样定义的 def foo(): pass 其实在函数式编程中,函数里面还可以嵌套函数,如下面这样 def foo(): print("hello worl ...

  5. 浅谈python中的“ ==” 与“ is”、还有cmp

    总之,比较内容相等使用 ‘==’ 1.is" 是用来比较 a 和 b 是不是指向同一个内存单元,而"=="是用来比较 a 和 b指向的内存单元中的值是不是相等 2.pyt ...

  6. 浅谈Python中函数式编程、面向对象编程以及古怪的PythonIC

    1.函数式编程作为结构化编程的一种,正在受到越来越多的重视.那么什么事函数式编程呢? 在维基百科中给出了详细的定义,函数式编程又称泛函数编程,是一种编程规范,它将函数运算视为数学上的函数计算.简单的来 ...

  7. 浅谈python中__str__和__repr__的区别

    很多时候我们在创建一个类的时候,在终端打印类或者查看的时候一般都不会得到一个太满意的结果 class T: def __init__(self): self.color="red" ...

  8. 浅谈Python 中 __getattr__与__getattribute__的区别

    __getattr__与__getattribute__均是一般实例属性截取函数(generic instance attribute interception method),其中,__getatt ...

  9. 浅谈python 中正则的一些函数

         主要的函数有  : match() search() findall() group() groups() split()  match (): 含义  开头匹配,匹配成功返回一个对象失败则 ...

随机推荐

  1. python的分支循环

    知识内容: 1.if-else分支结构 2.while循环 3.for循环 4.循环结构综述 5.break和continue语句 一.if-else分支结构 1.单分支选择结构 if 表达式: 语句 ...

  2. MYSQL体系结构-来自期刊

    MySQL三层体系结构 |-----------------------------------------------------------------------------------| | ...

  3. UVA350-水题

    #include<iostream> using namespace std; int main() { int c = 0; int Z, L, I, M; while (cin > ...

  4. Delphi XE6打电话

    procedure TPhoneDialerForm.btnMakeCallClick(Sender: TObject); var PhoneDialerService: IFMXPhoneDiale ...

  5. a 超链接标签

    Title百度 第一章 第一章 第一章内容 第二章内容 <!DOCTYPE html><html lang="en"><head> <me ...

  6. 用yield 实现协程 (包子模型)

    协程是一种轻量级的线程 无需线程上下级的开销, 所有的协程都在一个线程内执行 import time def consumer(name): print('%s is start to eat bao ...

  7. Git revert merge

    从history1分出来的A, B两个branch A上有一些更改,例如 changeA2 changeA1 history1 B上有一些更改,例如 changeB2 changeB1 history ...

  8. focusin 事件| focusout事件

    focusin 定义和用法 当元素(或在其内的任意元素)获得焦点时发生 focusin 事件. 当在元素或在其内的任意元素上发生 focus 事件时,focusin() 方法添加要运行的函数. 与 f ...

  9. cookie保存用户名及密码

    登陆页中,用户输入用户名密码,点击提交,后台对照mysq数据库中,看是否有对应的用户名,以及密码是否正确.如果正确 则将用户名密码分两份Cookie保存.页面跳转到登陆成功页. 用户再次访问登陆页时, ...

  10. ArcGIS案例学习笔记3_2

    ArcGIS案例学习笔记3_2 联系方式:谢老师,135-4855-4328, xiexiaokui#qq.com 时间:第3天下午 内容:CAD数据导入,建库和管理 目的:生成地块多边形,连接属性, ...