"is和None有什么区别?"iscomparestheobjectidentifier,用于检查对象的标识符是否一致,即两个对象在内存中的地址是否相同。当使用aisb时,相当于做了一个id(a)==id(b)的判断。==比较两个对象的值是否相等相当于调用了__eq__()方法,即a==b相当于a.__eq__(b)。"WhyuseiswhenmakingNonejudgments"▍这是PEP8中规定的"与None这样的单例比较应该总是用'is'或'isnot'来完成,永远不要使用相等运算符。"---来自PEP8▍为什么会有这样的规定?上面说了,None在Python中是一个单例对象。如果一个变量是None,它必须指向与None相同的内存地址。None是python中的一个特殊常量,代表一个空对象。Null值是Python中的一个特殊值。空数据并不意味着它是一个空对象。例如[]、''、()、{}等都不是None。a=Noneb=Noneprint(id(a)==id(b))#Trueprint([]isNone)#Falseprint(''isNone)#FalseNone与除自身以外的任何对象进行比较时返回False。__eq__()在==None后面调用,__eq__()可以重载,例如classtest():def__eq__(self,other):returnTrue=test()print(tisNone)#Falseprint(t==None)#True虽然很多时候使用==None会得到我们心中想要的结果,但是如果重载了对象的__eq__()方法,==操作可能会影响结果的判断。对了,像PyCharm这样的IDE一般都会提示==None不符合PEP8规范。不知道你有没有注意到。另外,从代码执行效率来看,isis比==快了很多。多于!
