飞道的博客

原创| Python中"等于"到底用 == 还是 is ?

394人阅读  评论(0)

   
  1. 点击上方“Python进击者”,选择“星标”公众号
  2. 超级无敌干货推送给你!!
  3. Python进击者第 181篇原创文章

前言

大家好,我是 kuls。

新年第一篇技术原创。

最近有读者问我一道面试题,希望我能够详细的写一写相关的内容,这不,马上安排!

is 和 == 的区别

看上去其实很简单,但是其中也有很多的细节,今天这篇文章就是带着大家来深入了解相关的知识。

举几个例子

如果一开始就解释,那么肯定很多小伙伴不会理解,所以我们先跑几个程序。


   
  1. >>> x = y = [ 4, 3, 1]
  2. >>> z = [ 4, 3, 1]
  3. >>>  print(x is y)
  4. True
  5. >>>  print(x == y)
  6. True
  7. >>>  print(x == z)
  8. True
  9. >>>  print(x is z)
  10. False

首先我们来看看这个例子,我们会发现x不管是使用 is 还是 == 都返回True,但是x,z的内容一样,使用 == 返回的True,但是使用 is 时候返回却是False。

在Python中,== 比较的是值,is 比较的是对象。

其中Python对象中主要包含id、值以及数据类型,在is的比较中比较的是id。

所以这里我们再打印一下x、y、z三者的id值


   
  1. >>>  print(id(x))
  2. 140513337973408
  3. >>>  print(id(y))
  4. 140513337973408
  5. >>>  print(id(z))
  6. 140513337973248

通过比较x与y的id值是相等的,但是z的id值就不同了。

为什么x与y是相同的呢?

在Python中,= 不仅仅只是赋值,它还会将引用地址也赋过去,所以在内存中,x和y调用的是同一个对象。

大家可以参照下图

我们接下来继续看


   
  1. >>> a =  '123'
  2. >>> b =  '123'
  3. >>>  print(a is b)
  4. True
  5. >>>  print(a == b)
  6. True
  7. ##############
  8. >>> c =  100
  9. >>> d =  100
  10. >>>  print(c == d)
  11. True
  12. >>>  print(c is d)
  13. True
  14. ##############
  15. >>> a =  1000
  16. >>> b =  1000
  17. >>>  print(a is b)
  18. False
  19. >>>  print(a==b)
  20. True

看到这里可能有些朋友就迷惑了,这...是啥?

首先我来说下字符串为什么会相等,其实在python中存在一个intern机制,这个机制中值同样的字符串对象仅仅会保存一份,这样做是为了提高Python的运行效率。

那么它是怎么实现的呢?其实很简单,这个intern机制就是通过维护字符串储蓄池(一个字典)来运作的,这个字典的key是字符串的值,value则是这个字符串的引用地址

每次当你创建一个新的字符串时,都会去该字符串储蓄池查找,是否有相同的字符串值,如果存在则直接调用该字符串的引用地址。

相信你看到这,已经明白字符串为什么会一直相等了。

接下来我们继续聊聊下面两个整型的比较,这个更让我们迷惑了。


   
  1. >>> c =  100
  2. >>> d =  100
  3. >>>  print(c == d)
  4. True
  5. >>>  print(c is d)
  6. True
  7. ##############
  8. >>> a =  1000
  9. >>> b =  1000
  10. >>>  print(a is b)
  11. False
  12. >>>  print(a==b)
  13. True

其实也并不难理解,在python中有小整数对象池的概念,小整数对象池简单来说就是在[-5,256]这个区间内创建的对象,不会被回收

也就是说,当你创建了一个整数在[-5,256]这个区间内时,它会先去查看是否有相同的值,如果有则直接引用该地址。

如果你创建的不是在这个区间内,那么它会重新创建一个新的对象,所以它的地址肯定也就不同了。

总结:在Python中,只有小整数对象池中和字符串会调用已经存在的地址,其他的像list,tuple,dict都会重新创建一个新的对象。

总结

在Python中,is 和 == 还是有一些区别的,我们不能随意的去使用它。

但是现在我们编写代码基本都是在IDE上,例如pycharm,在pycharm中它对解释器进行了优化,不管你的值是否在区间[-5,256]中,只要值相等那么他们两就会完全相等。所以这里需要特别注意。

OK,以上就是今天的文章,我们下期再见!

记得点赞、关注、在看呀!




   
  1. 你好啊
  2. 我是kuls
  3. 欢迎加我微信交流学习
  4. 阅读更多精彩文章,可以关注我!
  5. 关注公众号回复“pdf”
  6. 无套路领取原创Django、flask全套教程
  7. ⬇️

转载:https://blog.csdn.net/qq_36547531/article/details/112166918
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场