Python中is和==的区别

首先看下面一段程序:

    
    
  1. def test():
  2. # example 1
  3. a = 'hello'
  4. b = 'hello'
  5. print(a is b) # 输出True
  6. print(a == b) # 输出True
  7. # example 2
  8. a = 'hello world'
  9. b = 'hello world'
  10. print(a is b) # 输出False
  11. print(a == b) # 输出True
  12. # example 3
  13. a = [ 1, 2, 3]
  14. b = a
  15. print(a is b) # 输出True
  16. print(a == b) # 输出True

上面的输出结果为什么有的相同,有的不相同呢?

官方文档描述is为对象标示符(object identity),而==表示的是相等。is的作用是用来检查对象的标示符是否一致,也就是两个对象在内存中的位置是否一样,而==是用来检查两个对象是否相等。

我们来看一下下面的程序,检查每个对象的id


    
    
  1. def test():
  2. # example 1
  3. a = 'hello'
  4. b = 'hello'
  5. print(id(a)) # 输出2378974396344
  6. print(id(b)) # 输出2378974396344
  7. print(a is b) # 输出True
  8. print(a == b) # 输出True
  9. # example 2
  10. a = 'hello world'
  11. b = 'hello world'
  12. print(id(a)) # 输出2378974396344
  13. print(id(b)) # 输出2033022437424
  14. print(a is b) # 输出False
  15. print(a == b) # 输出True
  16. # example 3
  17. a = [ 1, 2, 3]
  18. b = a
  19. print(id(a)) # 输出1641701071688
  20. print(id(b)) # 输出1641701071688
  21. print(a is b) # 输出True
  22. print(a == b) # 输出True

打印出id结果就很清晰了,只要a和b值相同,==结果输出True;只有id相同,is结果输出True。但是有一个问题,为什么example1的'hello' a is b就输出True,而example2的'hello world'就输出False。

这是因为前一种情况下Python的字符串驻留机制起了作用。对于较小的字符串,为了提高系统性能Python会保留其值的一个副本,当创建新的字符串的时候直接指向该副本即可。所以'hello'在内存中只有一个副本,a和b的id值相同,而'hello world'是长字符串,不驻留内存,Python中各自创建了对象来表示a和b,所以他们的值相同,但是id值不同。(有些编译器会对程序优化,所以is操作可能不同)。

实际python中None的比较,为什么是is None,而不是== None呢?

这是因为None在Python里是个单例对象,一个变量如果是None,它一定和None指向同一个内存地址。而==None背后调用的是__eq__,而__eq__可以被重载,下面是一个is not None但== None的例子


    
    
  1. class Foo(object):
  2. def __eq__(self,other):
  3. return True
  4. f = Foo()
  5. print(f is None) # 输出False
  6. print(f == None) # 输出True
上面==被重载,所以输出True。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值