• 售前

  • 售后

热门帖子
入门百科

Python中对象的比较操纵==和is区别详析

[复制链接]
万象争辉1 显示全部楼层 发表于 2021-10-25 18:53:52 |阅读模式 打印 上一主题 下一主题
前言

Python 中对象的比力有两种方式 == 和 is。两种方式都能判断操作符两侧的变量值是否相等,那么它们的区别是什么呢?通过下面的先容我们来一探究竟。
比力操作符通常用于条件语句,如下示例:
  1. if a == b:
  2. pass
复制代码
  1. if a is False:
  2. pass
复制代码
== 与 is 的区别


== 操作符比力对象的值是否相等。小明有一块 劳力士 手表,小李也有一块同款 劳力士 手表,这时我们就以为这两块手表相等。
  1. 小明的手表 = 劳力士
  2. 小李的手表 = 劳力士
  3. 小明的手表 == 小李的手表
复制代码
is 操作符比力对象的身份标识是否相等,即对象在内存中的地址是否雷同,如果两个对象的身份标知趣等,就说明它们是同一个对象。小明的爸爸称谓小明叫 儿子,小明的女朋侪称谓小明叫 老公,但这两个称谓都代表 小明 这个人,即为同一个对象。
  1. 爸爸的儿子 = 小明
  2. 女朋友的老公 = 小明
  3. 爸爸的儿子 is 女朋友的老公
复制代码
接下来就用代码来展示一下 == 与 is 的区别:
  1. >>> a = [1, 2, 3]
  2. >>> b = [1, 2, 3]
  3. >>> a == b
  4. True
  5. >>> a is b
  6. False
  7. >>> id(a)
  8. 24603664
  9. >>> id(b)
  10. 24603144
复制代码
  1. >>> a = [1, 2, 3]
  2. >>> b = a
  3. >>> a == b
  4. True
  5. >>> a is b
  6. True
  7. >>> id(a)
  8. 24604144
  9. >>> id(b)
  10. 24604144
复制代码
在 Python 中 id 函数接收一个对象作为参数,并返回该对象在内存中的地址。
由以上代码可以分析出:== 操作符只比力两个对象的值是否相等,但不比力两个对象是否为同一个对象;而 is 操作符并不是比力两个对象的值是否相等,而是会确认两个对象是否为同一个对象,如果为同一个对象,那么它们的值自然相等。
Python 小整数对象池


以上两段代码已经可以或许体现出 == 与 is 的区别,不外 Python 中也有一些特殊情况,来看下面例子:
  1. >>> a = 5
  2. >>> b = 5
  3. >>> a == b
  4. True
  5. >>> a is b
  6. True
  7. >>> id(a)
  8. 1730274128
  9. >>> id(b)
  10. 1730274128
复制代码
  1. >>> a = 257
  2. >>> b = 257
  3. >>> a == b
  4. True
  5. >>> a is b
  6. False
  7. >>> id(a)
  8. 48558688
  9. >>> id(b)
  10. 48558720
复制代码
以上代码看起来就很怪异了,同样的比力操作,只是换了一个数字效果就不同了。
着实出现以上效果的原因在于 Python 自身。Python 出于性能上的思量,在解释器启动的时候就已经将 -5 到 256 的整数创建到内存中了。而当我们必要创建值在 -5 到 256 的 int 数字的时候,Python 并不会新开发一块内存去创建数字,而是直接将已存在的对象返回。
但是如果新创建的数字不在这个范围,Python 就会为每个变量单独开发本身的内存空间。
Python intern 机制


再来看下面关于字符串比力的例子:
  1. >>> a = 'hello world'
  2. >>> b = 'hello world'
  3. >>> a == b
  4. True
  5. >>> a is b
  6. False
  7. >>> id(a)
  8. 49465408
  9. >>> id(b)
  10. 49465448
复制代码
  1. >>> a = 'hello'
  2. >>> b = 'hello'
  3. >>> a == b
  4. True
  5. >>> a is b
  6. True
  7. >>> id(a)
  8. 49429152
  9. >>> id(b)
  10. 49429152
复制代码
想必根据之前数字比力的例子,你大概也能推测到以上代码效果不同的原因了。究竟上,以上效果同样是 Python 出于对性能的思量,不外这次 Python 并没有预先将 hello 字符串创建到内存中,而是利用了一种叫 intern 的机制。
关于 intern 机制在这里我们不去深究,以后有时机专门写一篇博客来先容。总之你必要知道在某些场景下,Python 会对字符串开启 intern 机制来进步性能,从而导致出现上面示例代码的效果。
== 与 is 各自的实用场景


什么时候用 ==、什么时候用 is 呢?
当我们必要比力一个变量与一个 单例 的时候,应该利用 is,其他情况通常利用 ==。
例如拿一个变量去跟 True 或 False 进行比力的时候就应该利用 is,由于用 is 的比力的速率要比用 == 更快。
用 is 比力对象的时候,只必要判断它们是否处于同一块内存地址即可,而用 == 比力更慢的原因在于当用 == 去比力对象的时候会调用对象的 __eq__() 方法,而 __eq__() 方法通常会被重载,实行其内部逻辑往往会多花一些时间。
以下就是一个重载对象 __eq__() 方法的例子:
  1. class MyList(object):
  2.   def __init__(self, *args):
  3.     self._list = [*args]
  4.   def __eq__(self, other):
  5.     result = False
  6.     for i in self._list:
  7.       for j in other._list:
  8.         if i == j:
  9.           break
  10.       else:
  11.         break
  12.     else:
  13.       result = True
  14.     return result
  15. li_1 = MyList(1, 2, 3)
  16. li_2 = MyList(1, 2, 3)
  17. print(li_1 == li_2) # True
复制代码
你可以自行实验修改 __eq__() 方法内部的逻辑来观察其效果。
总结

到此这篇关于Python中对象的比力操作==和is的文章就先容到这了,更多相干Python对象比力操作==和is内容请搜索草根技术分享从前的文章或继续欣赏下面的相干文章盼望各人以后多多支持草根技术分享!

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作