辨析Python中的 "is" & "=="

    Python是一门高级语言,因其简单易懂深得人心,虽不像C/C++那么复杂,但也不能低估了它。这次在编程中遇到“is”和“==”的使用问题,阅读了一些资料和博客后,做了总结,在此记下。

“is” & "=="的区别

运算符 运算规则
is 比较两个对象是否为同一个实例变量,id值是否相同,即存储地址是否相同
== 比较两个对象的内容(value)是否相同,默认调用对象的–eq–()方法

    is也叫做同一性运算符,“==”叫做比较操作符,从两者的名字上也可看出其不同。

注意事项

    虽然知道了两者的不同点,但在使用时也需要谨慎,最好从要达到的目的出发,若只是比较两个对象的值是否相等就用“==”,若需要比较两个对象是否为同一实例就用“is”。因为Python的一些性能优化机制会造成在某些情况下两个运算符的计算结果相同,引起budge。出现这种情况的原因:
★  Python性能优化
    ☆★  Python为提高其计算性能,会将一些频繁使用到的小整数缓存到内存中,即将[-5,256]之间的小整数自动缓存到small_ints链表中,对于这类数只引用不创建。因此即使是不同变量名的对象也可能是同一实例变量。
    ☆★  有小整数缓存那么肯定也会有字符串,Python也会将较短的string进行存储,不过实现方式与小整数的缓存机制不同,也有个高大上的名字string驻留机制,关于string驻留机制将会新开一篇笔记。
    ☆★  Python变量创建。在同一代码块中的变量,若值相同,那么该变量不会被重复创建,而是直接引用已经存在的对象。模块文件、函数体、类、交互式命令行中的单行代码均可构成独立的代码块。

总结

    谨慎使用is和==,从目的出发选择适合的运算符。会产生歧义的情况:
        1.小整数对象[-5,256]会被缓存到内存中,且在全局解释器范围内被重用,永远不会被GC收回;
        2.同一代码块中的不可变对象 ,若值相等就不会被重复创建,即使变量名不同;
        3.字符串驻留

☆☆☆☆☆☆☆☆☆鹿子

猜你喜欢

转载自blog.csdn.net/qq_42774567/article/details/86740158