踩坑记:python里使用 is 时的坑

概念上:

    is比较的是两个对象的id值是否相等,也就是比较两个对象是否为同一个实例对象,是否指向同一个内存地址。
    ==比较的是两个对象的内容是否相等,默认会调用对象的__eq__()方法。

 

但是要注意(在交互式命令行执行上面两段代码

>>> a = 299
>>> b = 299
>>> id(a)
44233104
>>> id(b)
44233168

 

  出于对性能的考虑,Python内部做了很多的优化工作

  对于整数对象,Python把一些频繁使用的整数对象缓存起来,保存到一个叫small_ints的链表中,在Python的整个生命周期内,任何需要引用这些整数对象的地方,都不再重新创建新的对象,而是直接引用缓存中的对象。

  Python把这些可能频繁使用的整数对象规定在范围[-5, 256]之间的小对象放在small_ints中,但凡是需要用些小整数时,就从这里面取,不再去临时创建新的对象。因为257不再小整数范围内,因此尽管a和b的值是一样,但是他们在Python内部却是以两个独立的对象存在的,各自为政,互不干涉。

来自:https://www.jb51.net/article/111957.htm

 

而当你使用pycharm时实际上发现不了这个情况

pycharm下:

a = 299
b = 299
print(id(a) is id(b))  #False
print(id(a) == id(b))  #True
print(id(a),id(b))  #35481552 35481552

一开始,比较奇怪为什么is会返回False ,我以为是两种本质上两种id就是不相同,pycharm做了处理

再试了字符串才发现,就不能用is比id

a = '299'
b = '299'
print(id(a) is id(b))  # False
print(id(a) == id(b))  # True
print(id(a), id(b))  # 30832096 30832096


if id(a) is id(b):
    print('ok')
else:
    print('no') # no

因此还是尽量用 == 来判断两种内容是否相同,当要判断两者id是否相同是时可以考虑is

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值