Python中进行None判断时,为什么用is而不是==

系统 1859 0

is None 区别在哪里」

  • is 比较的是对象标识符,用来检查对象的标识符是否一致,即两个对象在内存中的地址是否一致。在使用 a is b 的时候,相当于是做 id(a)==id(b) 判断。
  • == 比较两个对象的值是否相等,相当于调用 __eq__() 方法,即 a==b 等同于 a.__eq__(b)

「进行 None 判断时,为什么用 is

▍这在 PEP8 中有所规定

"Comparisons to singletons like None should always be done with 'is' or 'is not', never the equality operators."
--- From PEP8

▍为什么会有这样的规定

如上所述None在Python里是个 单例对象 ,一个变量如果是None,它一定和None指向同一个内存地址。None是python中的一个特殊的常量,表示一个空的对象。空值是Python中的一个特殊值, 数据为空并不代表是空对象 ,例如 [],'',(),{} 等都不是None。

          
            a = None
b = None
print(id(a) == id(b)) # True

print([] is None) # False
print('' is None) # False
          
        

None和任何对象比较返回值都是False,除了自己。 ==None 背后调用的 __eq__() ,而 __eq__() 可以被重载,e.g.

          
            class test():
    def __eq__(self, other):
        return True

t = test()
print(t is None) # False
print(t == None) # True
          
        

虽然很多时候用 ==None 会得到我们内心想要的结果,但是如果一个对象的 __eq__() 方法被重载, == 操作可能会影响结果的判断。对了,像PyCharm这样的IDE一般会提示 ==None 不符合PEP8规范,不知大家注意过没有。

另外从代码执行效率上来看, is is a LOT faster than ==

以上!



更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论