相关文章推荐
潇洒的保温杯  ·  Python ...·  3 周前    · 
含蓄的绿茶  ·  python ...·  3 周前    · 
逆袭的大海  ·  vs ...·  2 周前    · 
不要命的帽子  ·  flutter ...·  1 年前    · 
讲道义的热水瓶  ·  WPF NotifyIcon ...·  1 年前    · 
备案 控制台
学习
实践
活动
专区
工具
TVP
写文章
专栏首页 后场技术 认清Python下==和is的区别
2 0

海报分享

认清Python下==和is的区别

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

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

>>> a = 'hello'
>>> b = 'hello'
>>> a is b
>>> a == b
>>> # 如上情况 is 和 == 的结果一致>>> a1 = "I'm a long string for code testing"
>>> b1 = "I'm a long string for code testing"
>>> a1 is b1    
False
>>> a1 == b1
>>> # 如上情况 is 和 == 结果不一致>>> str1 = "string"
>>> str2 = "".join(['s', 't', 'r', 'i', 'n', 'g'])
'string'
>>> str1 is str2
False
>>> str1 == str2
>>> # 如上情况 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 a
>>> a == a
False

从上面的介绍弄清楚了 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。

文章分享自微信公众号:
后场技术

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

作者: 诺克大叔
原始发表时间: 2018-06-12
如有侵权,请联系 cloudcommunity@tencent.com 删除。