博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
详解-Python-的-“==”-和-“is”
阅读量:2441 次
发布时间:2019-05-10

本文共 766 字,大约阅读时间需要 2 分钟。

作者:chen_h

微信号 & QQ:862251340
微信公众号:coderpai


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

  1. is 是比较两个引用是否指向了同一个对象(引用比较)。
  2. == 是比较两个对象是否相等。
>>> 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是否相同)。

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

对象缓存机制

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

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

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

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


Reference:

转载地址:http://lvdqb.baihongyu.com/

你可能感兴趣的文章
交换机及路由器如何才能更加安全?(转)
查看>>
chinaunix
查看>>
WinXP优化 全面消除操作系统的复制乱码(转)
查看>>
检查字符串strSource是否为big或big5码(转)
查看>>
提高网站在Google中的排名——面向搜索引擎的网站设计(转)
查看>>
SQL Server 存储过程的经典分页(转)
查看>>
学习J2ME编程需要掌握的七种技术(转)
查看>>
DB2 UDB V8.1管理学习笔记(二)(转)
查看>>
Symbian OS 开发初级手册(转)
查看>>
限制只能中文输入的方法(转)
查看>>
共享池 shared pool
查看>>
一张图搞定Java面向对象
查看>>
Borland ALM之需求定义和管理解决方案
查看>>
Verizon选择Borland控制开发流程并降低风险
查看>>
Borland 崭新的Caliber Define IT产品
查看>>
IBM Rational RequisitePro集成简介
查看>>
OOAD利器Rational Rose的介绍
查看>>
一年的测试生活和感悟
查看>>
通过RUP用例进行需求管理的可追踪性策略(2)
查看>>
持续改进之配置管理变更的关键路径
查看>>