在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. Centos 的计划任务 crontab

    使用计划任务! crontab命令主要有3个参数: -e :编辑用户的crontab. -l :列出用户的crontab的内容. -r :删除用户的crontab的内容. 执行crontab -e,将 ...

  2. Spring bean注解配置(1)

    Spring自带的@Component注解及扩展@Repository.@Service.@Controller,如图 在使用注解方式配置bean时,需要引进一个包: 使用方法: 1.为需要使用注解方 ...

  3. 给iOS开发新手送点福利,简述UIScrollView的属性和用法

    UIScrollView 1.   contentOffset 默认CGPointZero,用来设置scrollView的滚动偏移量. // 设置scrollView的滚动偏移量 scrollView ...

  4. 基于Linux的Samba开源共享解决方案测试(一)

    转自http://blog.csdn.net/u013394982/article/details/17914429 Linux操作系统 Linux是一类Unix计算机操作系统的统称.Linux操作系 ...

  5. 不规则ROI的提取

    在网上看到基于opencv3.0之前的API实现不规则ROI的提取,我自己试了一下发现opencv3.0不行,第一想法是我写的有问题,最后发现是API的改版.原理很简单. 目标:提取黑线作为ROI 原 ...

  6. UVA-10115

    字符查找替换,WA了N次,一次只能替换一个,下一次find必须从第0个位置开始 import java.io.File; import java.io.FileNotFoundException; i ...

  7. aspx后台代码写在前段

    合并cs的代码 <%@ Page Language="C#" AutoEventWireup="true" Inherits="System.W ...

  8. Linux批量查询替换字符串

    Linux 批量查询替换文本文件中的字符串: 1.批量查找某个目下文件的包含的内容,例如: #   grep -rn "要找查找的文本" ./ 2.批量查找并替换文件内容. #   ...

  9. rar 按日期时间备份

    @echo off echo. echo backup start,please wait ... for /f %%i in ('date /t') do rar u F:\liaobin\bak\ ...

  10. 机器学习入门-提取文章的主题词 1.jieba.analyse.extract_tags(提取主题词)

    1.jieba.analyse.extract_tags(text)  text必须是一连串的字符串才可以 第一步:进行语料库的读取 第二步:进行分词操作 第三步:载入停用词,同时对分词后的语料库进行 ...