这两者之间有什么区别吗:

if foo is None: pass

and

if foo == None: pass

我在大多数Python代码(以及我自己编写的代码)中看到的约定是前者,但我最近遇到了使用后者的代码。None是NoneType的一个实例(也是唯一的实例,IIRC),所以它不应该有关系,对吗?有没有可能的情况?


当前回答

foo为None的原因是首选的方式,因为你可能正在处理一个对象,该对象定义了自己的__eq__,并将该对象定义为None。所以,如果你需要查看它是否为None,总是使用foo is None。

其他回答

你可能想读这个对象的身份和等价性。

语句'is'用于对象标识,它检查对象是否引用同一个实例(内存中相同的地址)。

而'=='语句指的是相等(相同的值)。

没有区别,因为相同的对象当然是相等的。然而,PEP 8明确指出您应该使用的是:

与None这样的单例对象的比较总是应该使用is或is not,而不是相等操作符。

a is b # returns true if they a and b are true alias
a == b # returns true if they are true alias or they have values that are deemed equivalence 


a = [1,3,4]
b = a[:] #creating copy of list
a is b # if gives false
False
a == b # gives true
True

is总是返回True如果它比较相同的对象实例

而==最终由__eq__()方法确定

i.e.


>>> class Foo(object):
       def __eq__(self, other):
           return True

>>> f = Foo()
>>> f == None
True
>>> f is None
False

(ob1 = ob2) = (id(ob1) == id(ob2))