未加星标

详解 Python 的 “==” 和 “is”

字体大小 | |
[开发(python) 所属分类 开发(python) | 发布者 店小二05 | 时间 2016 | 作者 红领巾 ] 0人收藏点击收藏

python中比较两个对象是否相等,一共有两种方法,简单来说,它们的区别如下:

is 是比较两个引用是否指向了同一个对象(引用比较)。 == 是比较两个对象是否相等。 >>> a = [1, 2, 3] >>> b = a >>> b is a # a的引用复制给b,他们在内存中其实是指向了用一个对象 True >>> b == a # 当然,他们的值也是相等的 True >>> b = a[:] # b通过a切片获得a的部分,这里的切片操作重新分配了对象, >>> b is a # 所以指向的不是同一个对象了 False >>> b == a # 但他们的值还是相等的 True 实现原理

is 比较的是两者是否是同一个对象,所以比较的是内存地址(id是否相同)。

== 是值比较。不可变对象,例如int,str,它会直接进行值比较。对于Python已知的对象,会调用他们的 __eq__ 函数来比较。(其实已知的对象应该也是通过内置的 __eq__ 函数来比较的)。对于自定义的对象,如果实现了 __eq__ 函数,就会使用它比较,如果没有实现,效果和 == 是一样的。

对象缓存机制

Python会对比较小的对象缓存,下次用到比较小的对象时,会去缓存区查找,如果找到,不会再开辟新的内存,而是继续把小对象的地址赋给新的值。例子:

>>> c = 1 >>> d = 1 >>> print(c is d) True >>> 1000 is 10**3 False >>> 1000 == 10**3 True

通过计算得到的赋值,不会使用缓存区。从第一个代码示例中可以看出。

对于字符串,你可以通过使用 intern 函数强制使用缓存区。

参考 Is there a difference between == and is in Python? python源码学习(八)――string对象的intern机制 比较python类的两个instance(对象) 是否相等

本文开发(python)相关术语:python基础教程 python多线程 web开发工程师 软件开发工程师 软件开发流程

主题: Python其实
分页:12
转载请注明
本文标题:详解 Python 的 “==” 和 “is”
本站链接:http://www.codesec.net/view/479733.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 开发(python) | 评论(0) | 阅读(47)