博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
认清Python下==和is的区别
阅读量:6313 次
发布时间:2019-06-22

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

通常在Python语言中我们判断两个字符串是否相等的时候,很多同学在初学Python的时候会混用==is,最后造成的结果就是出错的时候不知道怎么定位,结果也让自己意向不到。

下面我们先来看一下==is的表现:

>>> a = 'hello'>>> b = 'hello'>>> a is bTrue>>> a == bTrue>>> # 如上情况 is 和 == 的结果一致>>> a1 = "I'm a long string for code testing">>> b1 = "I'm a long string for code testing">>> a1 is b1    False>>> a1 == b1True>>> # 如上情况 is 和 == 结果不一致>>> str1 = "string">>> str2 = "".join(['s', 't', 'r', 'i', 'n', 'g'])>>> str2'string'>>> str1 is str2False>>> str1 == str2True>>> # 如上情况 is 和 == 结果不一致复制代码

为什么会出现这种情况呢?为什么在有些情况下is==输出结果相同有些情况又不同呢?我们简单做如下分析: 首先通过id()函数来看看这些变量在内存中的具体存储空间,整理情况如下:

从上图表格中我们可以看出来is==在验证两个字符串是否相等的时候表现是不一致的,显然如果你混用或者误认为他们是等同的那是存在风险的。

那么字符串的比较到底是用is还是==呢,我们来看一下Python中对两种操作的说明:

Operation Syntax Function
Identity a is b is_(a, b)
Equality a == b eq(a, b)

从上可知is表示的是标识符(Identity),而==表示的意思是相等(Equality),显然两者不是一个东西。

实际上造成上面输出结果不一致的根本原因在于is的作用在于用来检查对象的标识符是否一致,也就是说is是比较两个对象在内存中是否拥有同一块内存空间,它并不适合来判断两个字符串是否相等。a is b仅当a和b是同一个对象的时候才返回True, 所以a is b基本上相当于id(a) == id(b)。

==才是真正用来判断两个对象的值是否相等的,它实际调用的是builtins.py中的__eq__()方法,因此a == b相当于a.__eq__()b, 所以 == 操作符可以被重载,而 is 是不能被重载的。

一般情况下如果a is b为True的话a == b的值也是True,反之则亦然。 特殊情况除外,如下所示:

>>> a = float('NaN')>>> a is aTrue>>> a == aFalse复制代码

从上面的介绍弄清楚了is==的区别之后,我们再来看图示表格中的输出就不难理解了。细心点的同学可能会发现,在表格中a和b的id值一样,也就是说他们在同一内存空间地址中,而a1和b1的id值却不一样,这是为什么呢?这是因为Python中string interning(字符串驻留)机制所决定的: 相对于较小的字符串,Python为了提高性能会保留其值的一个副本,当你再次创建这个字符串的时候,直接就指向了这个副本,所以'hello'这个字符串是在内存中有一个副本的,所以a和b的id的值是一样的;而a1和b1是长字符串,并不会驻留,Python在内存中分别为a1和b1创建了一个内存对象来标识a1和b1,所以这两个对象拥有相同的内容但是标识符是不一样的,所以==的值为True而is的值为False。

所以最后总结一下,在Python里面你要判断两个对象是否相等你应该使用==而不是is。

转载地址:http://sbexa.baihongyu.com/

你可能感兴趣的文章
Hadoop日记Day1---Hadoop介绍
查看>>
iOS 学习资料汇总
查看>>
centos7 yum安装jdk
查看>>
Bluedroid与BluZ,蓝牙测试方法的变动(基于bludroid和BlueZ的对比)
查看>>
接口和抽象类有什么区别
查看>>
Linux 下添加用户,修改权限
查看>>
请问view controller scene,该如何删除
查看>>
bootstrap新闻模块样式模板
查看>>
zzzzw_在线考试系统①准备篇
查看>>
App Store 审核被拒的23个理由
查看>>
剑指offer第二版-1.赋值运算符函数
查看>>
javascript 对象
查看>>
Android学习笔记——文件路径(/mnt/sdcard/...)、Uri(content://media/external/...)学习
查看>>
Echart:前端很好的数据图表展现工具+demo
查看>>
CATransform3D iOS动画特效详解
查看>>
Linux VNC黑屏(转)
查看>>
Java反射简介
查看>>
react脚手架应用以及iview安装
查看>>
shell学习之用户管理和文件属性
查看>>
day8--socket网络编程进阶
查看>>