ToB企服应用市场:ToB评测及商务社交产业平台

标题: Python中 ‘==‘ 与‘is‘的区别 [打印本页]

作者: 道家人    时间: 2024-5-16 04:32
标题: Python中 ‘==‘ 与‘is‘的区别
比力判定逻辑是在代码中常常使用的,在Python中常用 '==' 和 is 来做比力判定。
关于整数
  1. # 按照逻辑,下面的代码很正常
  2. >>> a = 1
  3. >>> b = 1
  4. >>> a == b
  5. True
  6. >>> a is b
  7. True
  8. >>> id(a)
  9. 1570522768
  10. >>> id(b)
  11. 1570522768
  12. # 下面就是颠覆认知的时刻
  13. >>> a = 1000
  14. >>> b = 1000
  15. >>> a == b
  16. True
  17. >>> a is b
  18. False
  19. >>> id(a)
  20. 81183344
  21. >>> id(b)
  22. 81183376
复制代码
是的,两个相同值的变量,内存地址不一样了。固然产生这个征象的前提条件是用python命令行去执行,而不是用pycharm之类的编辑器。其根本原因也就是python解释器的问题,涉及到python的垃圾采取机制。上面征象的原因是因为一个叫做小整数对象池的东西。
Python为了优化速度,会把 [-5, 256] 之间的数据提前存放在小整数池中,假如程序使用到小整数池中的数据,是不会开辟新的内存空间去创建,而是指向对象池中的同一份数据,也就是说有N个变量等于1的话,那么这N个变量的内存地址都会指向小整数池中的1位置。小整数池的使用是为了避免整数频繁申请和烧毁内存空间。小整数池是提前创建好的,不会被垃圾采取。
当数据超出小整数池后,也就是范围到了大整数对象池中了,系统每次都会申请一块新内存来存储数据,这个'is'不等于'=='的征象也就不存在了。
pycharm中,每次运行是所有代码都加载到内存中,属于一个整体,并不存在这个征象。
关于字符串
  1. # 先来个正常的
  2. >>> a = 'qwe'
  3. >>> b = 'qwe'
  4. >>> a == b
  5. True
  6. >>> a is b
  7. True
  8. >>> id(a)
  9. 81797024
  10. >>> id(b)
  11. 81797024
  12. #  感觉没什么变化,那就加长一些
  13. >>> a = 'q' * 20
  14. >>> b = 'q' * 20
  15. >>> a is b
  16. True
  17. >>> a == b
  18. True
  19. # 在长点就不一样了
  20. >>> b = 'q' * 21
  21. >>> a = 'q' * 21
  22. >>> a is b
  23. False
  24. >>> a == b
  25. True
  26. >>> id(a)
  27. 81811696
  28. >>> id(b)
  29. 81811600
复制代码
产生原因:Python的intern机制。
简单理解有点像缓存的意思,当必要使用相同的字符串时(变量赋值),直接从缓存中拿出来用而不是重新创建,这样可以避免频繁的创建和烧毁,提升效率,节约内存。缺点是拼接字符串,对字符串修改之类的影响性能。因为是不可变的,所以对字符串修改不是inplace操作,而是新建对象。这也就是拼接字符串的时候不建议是用 '+' 方法,而是保举用join 函数,join函数是先盘算出所有字符串的长度,然后一一拷贝,而只创建一次对象。每个'+'方法都是创建一次新对象。当字符串长度超过20时,也不会使用intern机制。
并不是所有的字符串都会采用intern机制。只包含下划线,字母(包含巨细写),数字的字符串才会被intern。空格和一些特殊字符都不在内。也就是说字符串中假如包含空格和其他一些特殊符号(撤除下划线),python都不会应用intern机制,而是直接开辟新的内存空间去存储。
  1. #学习中遇到问题没人解答?小编创建了一个Python学习交流群:153708845
  2. # 注意下面这种看似合理的字符串intern
  3. >>> 'ab' + 'c' is 'abc'         #  这里的字符串,'ab' + 'c' 是在complie time 求值的,被替换成了'abc'
  4. True
  5. >>> n1 = 'ab'
  6. >>> n2 = 'abc'
  7. >>> n1 + 'c' is n2               # n1 + 'c'  是在run-time拼接,导致没有被自动intern
  8. False
  9. >>> n1 + 'c' is 'abc'
  10. False
  11. >>> n1 + 'c' == 'abc'
  12. True
  13. >>> n1 + 'c' == n2
  14. True
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4