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

if foo is None: pass

and

if foo == None: pass

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


当前回答

@Jason:

我建议使用类似于 如果foo: #foo不是None 其他: #foo为None

我不喜欢使用“if foo:”,除非foo真正代表一个布尔值(即0或1)。如果foo是一个字符串或对象或其他东西,“if foo:”可能工作,但它看起来像一个懒惰的快捷方式给我。如果你要检查x是否为None,请输入“If x is None:”。

其他回答

@Jason:

我建议使用类似于 如果foo: #foo不是None 其他: #foo为None

我不喜欢使用“if foo:”,除非foo真正代表一个布尔值(即0或1)。如果foo是一个字符串或对象或其他东西,“if foo:”可能工作,但它看起来像一个懒惰的快捷方式给我。如果你要检查x是否为None,请输入“If x is None:”。

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

John Machin的结论是None是单例,这段代码支持了这个结论。

>>> x = None
>>> y = None
>>> x == y
True
>>> x is y
True
>>> 

因为None是一个单例,x == None和x is None会有相同的结果。然而,在我的审美观点,x == None是最好的。

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

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