is和==

is

[] is []  # False
[] == []  # True

初学者看到上面的代码肯定会觉得有点奇怪。别急,还有更奇怪的

a = 256
b = 256
a is b  # True

a = 257
b = 257
a is b # False

a = 257
b = a
a is b # True

解释

is操作比较的是对象的id,对每个对象而言都有一个id

a = []
b = []
print id(a), id(b)

上面的代码输出两个不同的整数,而在内存中,a和b也是分别存储的。但是下面的代码就不一样了

a = []
b = a
print id(a), id(b)

上面的代码输出两个相同的整数,在内存中a,b也是相同的。
这样我们也就理解了a = 257,b = 257的情况

但是为啥

a = 256
b = 256
a is b  # True

其实是因为python为了优化,避免生成太多小整数对象(最常使用的对象),维护了一个small int对象池,所有在0到256的对象都直接从对象池里拿,而不是另外生成。

==

上面我们也看到了 [] == []是True,那么==背后的机理是什么呢?

class A:
    def __init__(self,x):
        self.x = x

a = A(1)
b = A(1)
print a == b #False

上面的例子中a和b对象都拥有相同的属性,但是却为不等。
为啥两个list可以根据元素是否相同判断是否相等呢?

解释

print dir(list)

我们发现,list有一个属性为eq,这就是秘密所在,我们在对对象进行判断相等性的时候,就会调用这个函数

class A:
    def __init__(self,x):
        self.x = x

    def __eq__(self, other):
        return self.x == other.x

a = A(1)
b = A(1)
print a == b #True

现在,只要A类的对象拥有相等的x属性,它们就相等

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,929评论 18 399
  • 最近在写个性化推荐的论文,经常用到Python来处理数据,被pandas和numpy中的数据选取和索引问题绕的比较...
    shuhanrainbow阅读 10,026评论 6 19
  • 我已经结婚三年了,两地分居,还没有孩子。 我在一个小城的国有银行工作,这是一个偏僻的海边小镇,岂止远离北上广,就连...
    桃与桃夭阅读 1,846评论 0 2
  • 祖国中医学认为,百合味甘、性平、无毒,甜美可口,有润肺、祛痰、止咳、健胃、安心定神,促进血液循环、清热利尿等功效,...
    贰無〇肆阅读 12,762评论 0 0
  • 根据那个环境和国服也刚刚
    肖宇轩阅读 663评论 0 0